本文介绍: 垃圾回收主要根据可达性分析,判断一个对象是否可以被回收,当一个对象被判定为从GC ROOT不可达,也并非一定被回收。第一次标记:该对象从GC ROOT不可达(或者说不存在GC ROOT引用链)第二次标记:就会判断该对象是否实现或者被调用 finalize 方法。
参考
三者区别
final
- final 是 java 关键字
- 可修饰变量(类成员变量、类静态变量、局部变量和形参):表示不可修改当前变量的值(这里的值可以是地址,也可以是基本类型的值)#(注意:final只是限定当前变量的值,并不会限制引用对象的增删改查)#
- 可修饰方法:表示方法不可以被重写(Override),可以修饰private、static修饰的方法
- 可修饰类:表示当前类不可以被继承(较多的基本类型的引用类型都是final修饰的)
- final 还可以提升性能:从并发角度分析#后续分析#
finally
- java 关键字,是一种能够保证代码一定被执行的机制,当然也有两种情况不会执行:
- try 未被执行
- 在finally之前执行了 System.exit(0) 语句,强制退出
finalize
- java 关键字
- 是Object类中定义的方法
- 主要用于垃圾回收
为啥 finalize不推荐使用
-
垃圾回收主要根据可达性分析,判断一个对象是否可以被回收,当一个对象被判定为从GC ROOT不可达,也并非一定被回收。因此对象被回收需要经历两次标记过程,才会判断一个对象是否需要真正被回收。
总结:如果对象未实现 finalize 方法,在经历第二次标记后,会被判定为直接回收,另外,finalize方法并不保证一个对象一定被回收
两次标记:
-
第一次标记:该对象从GC ROOT不可达(或者说不存在GC ROOT引用链)
-
第二次标记:就会判断该对象是否实现或者被调用 finalize 方法
- 如果确定该队形一定要执行 finalize 方法,首先将该对象添加进F-队列中
- 然后收集器会对F-队列中的对象再次进行标记,如果该对象在执行finalize方法的时候,被其他GCRoot可达的对象引用,该对象就不会被回收
调用finalize方法,对象一定被回收吗?
- 被添加到F队列的对象,稍后虚拟机自动建立低优先级的回收线程执行finalize方法(这里的执行只是表示开始执行**#finalize#**,由于极端对象由于死循环、执行慢的情况,会导致队列中的其他对象一直处于等待场景,因此,并不保证 finalize 执行完成)
- 如果对象在 finalize 方法中被其他GCRoot可达的对象引用,该对象就不会被回收
了解Cleaner机制(后续补充)
finally 和 Return 的执行顺序
原文地址:https://blog.csdn.net/Bourne_First/article/details/135894529
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_64419.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。