iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java 为什么要避免使用finalizer和Cleaner
  • 645
分享到

Java 为什么要避免使用finalizer和Cleaner

2024-04-02 19:04:59 645人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录避免使用的原因:行为的不稳定性移植性问题性能问题安全问题两个用处:安全网回收本地对等体对象java9之前finalizer,java9使用cleaner代替了finalizer。

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

以上就是Java 为什么要避免使用finalizer和Cleaner的详细内容,更多关于Java 避免使用finalizer和Cleaner的资料请关注编程网其它相关文章!

--结束END--

本文标题: Java 为什么要避免使用finalizer和Cleaner

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java 为什么要避免使用finalizer和Cleaner
    目录避免使用的原因:行为的不稳定性移植性问题性能问题安全问题两个用处:安全网回收本地对等体对象java9之前finalizer,java9使用cleaner代替了finalizer。...
    99+
    2022-11-12
  • Java避免使用finalizer和Cleaner的原因是什么
    这篇文章主要介绍了Java避免使用finalizer和Cleaner的原因是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。java9之前finalizer,java9使用...
    99+
    2023-06-14
  • javascript为什么要避免使用eval()和with()
    这篇文章将为大家详细讲解有关javascript为什么要避免使用eval()和with(),小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。避免使用eval()和with()with() 会在全局范...
    99+
    2023-06-17
  • java为什么避免使用枚举
    在Java中,枚举是一种特殊的数据类型,用于定义一组有限的常量。虽然枚举在某些情况下非常有用,但也有一些情况下建议避免使用枚举,原因...
    99+
    2023-08-30
    java
  • Vue中为什么要避免同时使用v-for和 v-if
    这篇文章主要介绍了Vue中为什么要避免同时使用v-for和 v-if,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。v-for 遍历避免同时使用 v-if为什么要避免同时使用&...
    99+
    2023-06-26
  • JavaScript为什么避免使用with()
    这篇文章主要为大家展示了“JavaScript为什么避免使用with()”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript为什么避免使用with...
    99+
    2022-10-19
  • Vue3使用需要避免的错误是什么
    本篇内容主要讲解“Vue3使用需要避免的错误是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3使用需要避免的错误是什么”吧!使用Reactive声明原始值数据声明在过去都是非常直接的,...
    99+
    2023-07-06
  • Java开发为什么需要使用UML
    这篇文章主要介绍Java开发为什么需要使用UML,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!知道UML造成了怎样的局面大混乱吗?知道什么样的功能是UML拥有但Java不具备的吗?知道我们为什么需要除JAVA外的另一...
    99+
    2023-06-03
  • 为什么vue要和nodejs一起使用
    前端开发中,由于业务逻辑越来越复杂,单纯的app就更难以胜任,为了提高开发效率和质量,后端也要为前端提供更多灵活的数据支持,这就涉及到跨域和服务器的简洁性问题。由于前端JavaScript语言的快速发展,人们诞生了新一代的前端服务器端技术,...
    99+
    2023-05-14
  • 好程序员Java分享为什么要使用Docker
    好程序员Java培训分享为什么要使用Docker,概述作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。更高效的利用系统资源由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用...
    99+
    2023-06-02
  • 【JAVA】为什么要使用封装以及如何封装
    个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 前言 Java的封装指的是在一个类中将数据和方法进行封装,使其可以保护起来,只能在该类内部访问,而不允许外部直接访...
    99+
    2023-10-04
    java python 开发语言
  • Python 和异步编程:为什么要使用 NumPy 和 NPM?
    在当今互联网时代,数据量已经变得越来越庞大。为了更好地处理这些数据,我们需要使用一些专业的工具和技术。Python 语言一直以来就是数据处理领域最受欢迎的编程语言之一,而异步编程则是 Python 处理大量数据的有效手段之一。本文将介绍 ...
    99+
    2023-07-22
    numy 异步编程 npm
  • Java开发中为什么要使用单例模式详解
    目录一、什么是单例模式?二、实战案例一:处理资源访问冲突三、实战案例二:表示全局唯一类一、什么是单例模式? 单例设计模式(Singleton Design Pattern)理解起来非...
    99+
    2022-11-12
  • 为什么使用 Java 接口重定向时要考虑 JavaScript?
    Java 接口重定向是一个非常常见的技术,但是在使用的时候,我们需要考虑 JavaScript 的影响。本文将介绍为什么使用 Java 接口重定向时要考虑 JavaScript,并提供一些演示代码。 首先,让我们简单介绍一下 Java 接口...
    99+
    2023-07-10
    接口 重定向 javascript
  • 为什么要在Java项目中使用Numy作为日志记录工具?
    在Java项目中使用Numy作为日志记录工具有很多好处。Numy是一种基于日志的分析工具,可以帮助开发人员更好地监控和分析应用程序的行为和性能。 首先,Numy可以帮助开发人员更好地了解应用程序的运行情况。通过记录应用程序的日志信息,Num...
    99+
    2023-10-07
    日志 npm numy
  • 剖析Java中在Collection集合中使用contains和remove为什么要重写equals
    目录引言源码剖析实例测试String类和包装类的特殊情况自定义类型总结引言 在Collection集合中: contains方法是判断一个集合里面是否包含指定元素,如果有则返回tru...
    99+
    2022-11-12
  • 为什么在HTTP索引中使用Java对象是必要的?
    HTTP 索引是一种用于存储和查询信息的数据结构。通常情况下,我们使用 HTTP 索引来存储和查询文本数据,但是在某些场合下,我们需要存储和查询 Java 对象。本文将探讨为什么在 HTTP 索引中使用 Java 对象是必要的,并演示如何使...
    99+
    2023-09-13
    对象 http 索引
  • 为什么要使用 Python 和 Apache 实现路径同步?
    在现代化的软件开发中,代码的协同工作是至关重要的一部分。在多人或者多团队共同开发的项目中,往往需要对代码进行版本控制,并且确保在不同的环境中代码是一致的。为了实现这样的目标,很多开发者选择使用 Python 和 Apache 实现路径同步...
    99+
    2023-09-29
    apache path 同步
  • 你知道C++中new和delete为什么要匹配使用吗
    目录前言new 和 delete 做了什么内置类型new 和 new []delete 和 delete [ ]自定义类型new 和 new []delete 和 delete [ ...
    99+
    2023-01-10
    C++ new delete匹配使用 C++ new delete使用 C++ new delete
  • 为什么使用Java和Unix来编写NumPy函数?
    随着数据科学和人工智能的快速发展,NumPy成为了一个非常受欢迎的Python包,用于进行科学计算和数据分析。然而,在某些情况下,Java和Unix可能会成为编写NumPy函数的更好选择。在本文中,我们将探讨这些情况,并提供一些演示代码。...
    99+
    2023-07-09
    unix numy 函数
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作