返回顶部
首页 > 资讯 > 精选 >Java避免使用finalizer和Cleaner的原因是什么
  • 501
分享到

Java避免使用finalizer和Cleaner的原因是什么

2023-06-14 08:06:40 501人浏览 泡泡鱼
摘要

这篇文章主要介绍了Java避免使用finalizer和Cleaner的原因是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。java9之前finalizer,java9使用

这篇文章主要介绍了Java避免使用finalizer和Cleaner的原因是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

java9之前finalizer,java9使用cleaner代替了finalizer。相比finalizer,cleaner(它存在于一个独立类Cleaner中,需要时候注入到对应类中即可)不会污染api而且cleaner有类库可以控制它的线程(它两都在后台线程中执行)。

避免使用的原因:

行为的不稳定性

它两都不能保证及时的执行,从方法可达到(对象被置空了)开始到最终的执行,时间是任意长的。所以千万不要使用他们来更新重要的持久状态,如释放流资源、分布式等。

System.GC和System.runFinalization这两个方法会增加finalizer和cleaner被执行的机会,但是不保证一定会执行。唯一能保证它两会被执行的两个方法(System.runFinalizersOnExit和Runtime.runFinalizersOnExit)有致命的缺陷,已经被废除很久了。

移植性问题

不同的JVM堆垃圾回收的算法不同,如果程序依赖finalizer或者cleaner被执行的时间点,那么程序的表现可能截然不同

性能问题

finalizer和cleaner有一个非常严重的性能损耗。

安全问题

  • finalizer中如果出现异常会导致线程终止,但是不会打印线程轨迹甚至警告都不会打印出来,而且使正在销毁的对象处于破坏状态,另一个线程如果使用这个破坏状态的对象会出现行为的不确定性。cleaner没有这个问题。

  • finalizer攻击:利于finalizer方法,构建出恶意子类对象,非法调用父类方法。final类不会被构建恶意子类,所以不会遭到finalizer攻击。对于非final类,重写一个空的finalizer方法并用final修饰来防止finalizer攻击。

//构建对象使用后不能再次被实例化public class Demo{  private boolean flag = true;  //防止实例化  public Demo() {    if (flag){      throw new RuntimeException("不准许再次创建对象");    }  }  public void say() {    System.out.println("DemoUtils.say");  }}//构建非法子类class Demo2 extends Demo{  public Demo2(){}  //构建finalizer攻击  @Override  protected void finalize() throws Throwable {    //会调用父类方法    this.say();    System.exit(0);  }  public static void main(String[] args) throws InterruptedException {    try {      //创建子类对象必然会调用父类构造,所以会发生异常      //但是在gc中还是执行了父类的方法      Demo demo = new Demo2();      demo.say();    } catch (Exception e) {      System.out.println(e);    }    System.gc();    //给垃圾回收提供时间    Thread.sleep(5000);  }}//运行结果java.lang.RuntimeException: 不准许再次创建对象DemoUtils.say

两个用处:

安全网

当资源的所有者忘记使用close方法的时候,finalizer和cleaner可以充当安全网,虽然不能保证及时的释放资源,但是迟一点释放总比永远不释放要好。要使用这样的安全网就要认证的考虑清除是否值得付出这样的代价。所以Java一些AutoCloseable实现中都添加了安全网。

这是FileOutputStream的源码

Java避免使用finalizer和Cleaner的原因是什么

回收本地对等体对象

本地对等体:java操作native方法其实是委托给一个本地对等体对象,使用完成后java对象会被GC回收,但是这个对等体对象不是java对象不会被会GC回收。如果这个对象性能可以接受,而且没有需要及时释放的资源那么就可以使用finalizer或者cleaner进行回收了。但是如果这个对等体性能无法接受且拥有必须被及时终止的资源,那么就需要提供一个close方法了。

感谢你能够认真阅读完这篇文章,希望小编分享的“Java避免使用finalizer和Cleaner的原因是什么”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: Java避免使用finalizer和Cleaner的原因是什么

本文链接: https://lsjlt.com/news/269431.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java避免使用finalizer和Cleaner的原因是什么
    这篇文章主要介绍了Java避免使用finalizer和Cleaner的原因是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。java9之前finalizer,java9使用...
    99+
    2023-06-14
  • Java 为什么要避免使用finalizer和Cleaner
    目录避免使用的原因:行为的不稳定性移植性问题性能问题安全问题两个用处:安全网回收本地对等体对象java9之前finalizer,java9使用cleaner代替了finalizer。...
    99+
    2024-04-02
  • mysql中怎么避免使用null定义字段的原因是什么
    本篇文章给大家分享的是有关mysql中怎么避免使用null定义字段的原因是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一 NULL 为什么这么经常用(1) java的nu...
    99+
    2023-06-20
  • 避免async await的使用及原理是什么
    这篇文章主要讲解了“避免async await的使用及原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“避免async await的使用及原理是什么”吧!谎言和as...
    99+
    2023-07-02
  • PHP float不准的原因是什么及怎么避免
    今天小编给大家分享一下PHP float不准的原因是什么及怎么避免的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、为什么f...
    99+
    2023-07-05
  • java为什么避免使用枚举
    在Java中,枚举是一种特殊的数据类型,用于定义一组有限的常量。虽然枚举在某些情况下非常有用,但也有一些情况下建议避免使用枚举,原因...
    99+
    2023-08-30
    java
  • 免费IP不能用的原因是什么
    这篇文章主要讲解了“免费IP不能用的原因是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“免费IP不能用的原因是什么”吧!1、免费代理IP可用性低。2、免费的代理IP,使用起来比较麻烦。选...
    99+
    2023-06-20
  • 使用redis的原因是什么
    这篇文章给大家分享的是有关使用redis的原因是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的...
    99+
    2024-04-02
  • Vue3使用需要避免的错误是什么
    本篇内容主要讲解“Vue3使用需要避免的错误是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3使用需要避免的错误是什么”吧!使用Reactive声明原始值数据声明在过去都是非常直接的,...
    99+
    2023-07-06
  • javascript为什么要避免使用eval()和with()
    这篇文章将为大家详细讲解有关javascript为什么要避免使用eval()和with(),小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。避免使用eval()和with()with() 会在全局范...
    99+
    2023-06-17
  • react中使用node的原因是什么
    这篇文章主要讲解了“react中使用node的原因是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“react中使用node的原因是什么”吧! ...
    99+
    2024-04-02
  • Python使用pytest playwright的原因是什么
    这篇文章主要介绍了Python使用pytest playwright的原因是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python使用pytest playwright的原因是什么文章都会有所收获,下面...
    99+
    2023-07-05
  • 不在分页中使用offset和limit的原因是什么
    这篇文章主要讲解了“不在分页中使用offset和limit的原因是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“不在分页中使用offset和limit的...
    99+
    2024-04-02
  • MongoDB中使用 B树的原因是什么
    本篇文章给大家分享的是有关 MongoDB中使用 B树的原因是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。MongoDB 是一个通用的、...
    99+
    2024-04-02
  • Vue框架使用PostCSS的原因是什么
    本篇内容介绍了“Vue框架使用PostCSS的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用PostCss的原因大家都知道转换...
    99+
    2023-06-20
  • gitee使用git命令的原因是什么
    本篇内容介绍了“gitee使用git命令的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一. Git 作为版本控制系统的基础首先,...
    99+
    2023-07-05
  • 用jquery的on原因是什么
    这篇文章主要介绍用jquery的on原因是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 在jquery中,因为需要在被选元素及子元素上添加一个或者多...
    99+
    2024-04-02
  • linux和unix相似的原因是什么
    这篇文章主要介绍“linux和unix相似的原因是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“linux和unix相似的原因是什么”文章能帮助大家解决问题。 ...
    99+
    2023-03-13
    linux unix
  • java程序cpu占用过高的原因是什么
    Java程序CPU占用过高的原因可能有多种:1. 代码问题:Java程序中可能存在大量的循环、递归或者重复计算等操作,导致程序运行时...
    99+
    2023-08-08
    java
  • vue使用fengMap速度慢的原因是什么
    这篇文章主要介绍“vue使用fengMap速度慢的原因是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue使用fengMap速度慢的原因是什么”文章能帮助大家解决问题。使用fengMap速度慢...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作