读书笔记-2java虚拟机的可达性算法与finalize方法
来源:互联网 发布:js复制文字到剪贴板 编辑:程序博客网 时间:2024/04/29 20:48
JAVA通过可达性分析算法来确定堆中哪些对象是应该被回收的。
很多人包括我以前在不了解的时候总以为是通过引用计数器来判断某个对象是否应该被回收但是后来想了想包括查阅一些资料发现不是这样的,因为如果采用引用计数器的方式没有办法解决循环引用的问题。
关于可达性分析算法,在jvm中有个GC Root Set ,里面有不确定个数的gc root 。可以作为gc root的对象有以下几种
1.虚拟机栈中的引用对象
2.方法区中类静态属性引用的对象
3.方法区中的常量引用的对象
4.本地方法栈中jni引用的对象
jvm就是通过这些gc root来判定对象是否还存活的,该算法的基本思想是通过一系列的gc root 做为起始点向下搜索,搜索走过的路径称为引用链,当一个对象到gc root没有任何引用链的时候,就说明该对象是不可引用的,此时不可被引用的对象便是可以回收的对象。
关于可达性分析算法,在jvm中有个GC Root Set ,里面有不确定个数的gc root 。可以作为gc root的对象有以下几种
1.虚拟机栈中的引用对象
2.方法区中类静态属性引用的对象
3.方法区中的常量引用的对象
4.本地方法栈中jni引用的对象
图中object5 6 7都是可以回收的
虽然是可以回收的,这里还涉及到了是否一定会被回收。
- 当对象无法与gc root相连时,判定对象是可以回收的
- 当对象被判定为可以回收的时候,判断其时候一定要被回收
- 在1,2两个条件满足的情况下,当对象没有覆盖finalize方法,或者finaze方法被执行过虚拟机将判定该对象没有必要执行finalize方法
- 如果被判定为没有必要执行finalize方法,那么将会把对象放到一个F-Queue(finalize queue :释放队列)中,最后将由虚拟机建立一个低优先级的finalizer线程去释放F-Queue中的对象
- 在释放过程中对象还可以完成一次自救,自救的方法就是让自己与gc root关联起来就可以了例如在对象的finalize方法中把自己也就是this赋值给一个一个其他对象的变量类型是当前对象的类型属性(但是如果这个其他对象也是在F-Queue中的就不能完成自救,原因就是这个其他对象本省并不能与gc root相关联),但是因为任何一个对象的finalizer方法只能由虚拟机执行一次,所以任何一个需要被回收的对象,也只能完成一次自救。
后记:
finalize这个方法建议大家平时不要用,这个方法完全是当时java诞生的时候为了照顾c++程序员做出的一种妥协,正常开发过程中完全可以忘记有这个方法。
finalize这个方法建议大家平时不要用,这个方法完全是当时java诞生的时候为了照顾c++程序员做出的一种妥协,正常开发过程中完全可以忘记有这个方法。
作者:北京小明
QQ:645707787
Phone:18311276689
如果有哪里不正确的地方,欢迎指正。
QQ:645707787
Phone:18311276689
如果有哪里不正确的地方,欢迎指正。
1 1
- 读书笔记-2java虚拟机的可达性算法与finalize方法
- Java虚拟机垃圾回收(一) 基础:回收哪些内存/对象 引用计数算法 可达性分析算法 finalize()方法 HotSpot实现
- Java虚拟机垃圾回收(一) 基础:回收哪些内存/对象 引用计数算法 可达性分析算法 finalize()方法 HotSpot实现分析
- Java的垃圾回收与finalize方法
- java jvm GC的基石 可达性算法
- java的finalize方法详解
- java finalize方法的使用
- java finalize方法的使用
- java finalize方法的使用
- java finalize方法的使用
- Java垃圾收集器与类的finalize()方法总结
- Java 对象释放与 finalize 方法
- java finalize方法总结、GC执行finalize的过程
- java finalize方法总结、GC执行finalize的过程
- java finalize方法总结、GC执行finalize的过程
- java finalize方法总结、GC执行finalize的过程
- java finalize方法总结、GC执行finalize的过程
- java finalize方法总结、GC执行finalize的过程
- 【SpringMVC框架】注解的处理器映射器和适配器配置
- 由按钮和图片引发的事件传递血案
- 让偷走时间的工作逻辑滚蛋
- 【案例大咖秀】呆在排行榜前五的APP是怎么捞用户的
- 设计模式之策略模式
- 读书笔记-2java虚拟机的可达性算法与finalize方法
- STM32实验连载之四:读取芯片唯一ID号
- Qt中的QString, int等数据转换
- python Tips系列:判断list是否为空
- Java Web乱码分析及解决方案(二)——POST请求乱码
- 图像纹理特征的学习
- 为什么不能用memcached存储Session?
- 1040. Longest Symmetric String
- spring,springmvc获取bean