当前位置: 首页 > news >正文

对象的finalization机制Test

Java语言提供了对象终止(finalization)机制来允许开发人员自定义对象被销毁之前的处理逻辑。当垃圾回收器发现没有引用指向一个对象时,通常接下来要做的就是垃圾回收,即清除该对象,而finalization机制使得在清除此对象之前,总会先调用这个对象的finalize()方法。finalize()方法允许在子类中被重写,用于在对象被回收时进行资源释放或清理相关内存,例如关闭文件、套接字和数据库连接等。但是,不要过分依赖对象的finalize()方法来释放资源,最好有其他的方法来释放资源,例如手动调用close()方法,理由如下。(1)在调用finalize()方法时可能会导致对象复活,即在finalize()方法中当前对象this又被赋值给了一个有效的变量引用。(2)一个糟糕的finalize()会严重影响GC的性能,而长时间的GC是会影响程序运行性能和体验的。(3)finalize()方法的执行时间是没有保障的,它完全由GC线程决定,极端情况下,若不发生GC,则finalize()方法将没有执行机会。另外,finalize()方法工作效率很低。如果一个对象在回收前需要调用finalize()方法的话,要先将其加入一个队列,之后由Finalizer线程处理这些对象,而这个线程的优先级非常低,所以很难被CPU执行到,进而导致对象的finalize()方法迟迟不能被执行,资源迟迟不能被释放,对象迟迟不能被垃圾回收。从功能上来说,finalize()方法与C++中的析构函数比较相似,都是用来做清理善后的工作。只不过C++中需要手动调用析构函数清理内存,而Java采用的是基于垃圾回收器的自动内存管理机制。finalize()方法在本质上不同于C++中的析构函数。由于finalize()方法的存在,JVM中的对象一般处于三种可能的状态。如果从所有的根节点都无法访问到某个对象,说明该对象已经不再使用了。一般来说,此对象需要被回收。但事实上,也并非是“非死不可”的,这时候它们暂时处于“缓刑”阶段。一个无法触及的对象有可能在某一个条件下“复活”自己,如果这样,那么对它的回收就是不合理的,为此,定义JVM中的对象可能的三种状态。

(1)可触及的:从根节点开始,可以到达这个对象
(2)可复活的:对象的所有引用都被释放,但是对象有可能在finalize()中复活。(3)不可触及的:对象的finalize()被调用,并且没有复活,那么就会进入不可触及状态。不可触及的对象不可能被复活,因为每一个对象的finalize()只会被调用一次。以上三种状态中只有在对象不可触及时才可以被回收。判定一个对象objA是否可回收,至少要经历以下两次标记过程。(1)如果GC Roots到对象objA没有引用链,则进行第一次标记。(2)判断此对象是否有必要执行finalize()方法。如果对象objA没有重写finalize()方法,或者finalize()方法已经被JVM调用过,则JVM视为“没有必要执行”​,objA被判定为不可触及。如果对象objA重写了finalize()方法,且还未执行过,那么objA会被插入到F-Queue队列中,由一个JVM自动创建的、低优先级的Finalizer线程触发其finalize()方法执行。finalize()方法是对象逃脱死亡的最后机会,稍后GC会对F-Queue队列中的对象进行第二次标记。如果objA在finalize()方法中与引用链上的任何一个对象建立了联系,那么在第二次标记时,objA会被移出“即将回收”集合。之后,对象如果再次出现没有引用存在的情况,finaliz()方法就不会被再次调用,对象会直接变成不可触及的状态,也就是说,一个对象的finalize()方法只会被调用一次。

http://www.lryc.cn/news/576920.html

相关文章:

  • 智慧水务:未来城市水务管理的创新实践与科技飞跃
  • 【科技核心期刊推荐】《计算机与现代化》
  • 学习使用dotnet-dump工具分析.net内存转储文件(3)
  • Java 数据结构 泛型
  • ListExtension 扩展方法增加 转DataTable()方法
  • 常用指令合集(DOS/Linux/git/Maven等)
  • BP-Tools21.02下载 加解密利器 金融安全交易算法工具 PCI认证工具 金融和智能卡的数据加解密和数据转换工具
  • RabbitMQ中,basicAck、basicNack和basicReject是三种核心的消息确认机制
  • 左神算法之矩阵旋转90度
  • 浮油 - 3 相分层和自由表面流 CFX 模拟
  • github上传代码步骤(http)
  • Docker安装的gitlab配置ssl证书
  • 电力协议处理框架C++版(一)
  • ECMAScript 2019(ES2019):数组与对象操作的精细化升级
  • 【linux】权限深入解析
  • Cursor 教程:用 Cursor 创建第一个 Java 项目
  • Mac homebrew 安装教程
  • 【数据集处理】基于 3D-GloBFP建筑轮廓数据 栅格化建筑数据(完整Python代码)
  • 【模拟】数⻘蛙(medium)
  • MybatisPlus-02.快速入门-入门案例
  • RagFlow 更适合企业级深度应用,FastGPT 更适合快速开发和原型验证
  • Kafka4.0初体验
  • games101 作业6
  • 从GPTs到Real智能体:目前常见的几种创建智能体方式
  • [双指针]1498. 满足条件的子序列数目
  • Mybatis多条件查询设置参数的三种方法
  • Linux系统移植15:Linux内核编译
  • 数据挖掘、机器学习与人工智能:概念辨析与应用边界
  • Ubuntu服务器(公网)- Ubuntu客户端(内网)的FRP内网穿透配置教程
  • 通达信【MACD趋势增强系统】幅图(含支撑压力位)