很想知道jvm怎么解决java循环引用的有关问题
很想知道jvm如何解决java循环引用的问题。
java中的循环引用是怎么解决的啊?菜鸟求大神解释,真的想知道。
------解决方案--------------------
你指的是垃圾收集的时候,jvm怎么处理交叉引用的吧?
jvm的垃圾收集有多种机制,不是一言两语能够说清楚,建议看《深入浅出Java虚拟机》此书对垃圾收集有比较详细的描述。
------解决方案--------------------
java jvm的官方实现版本是HotSpot,他 的GC回收是通过可达性算法实现的,而不是通过引用计数器算法。
所谓的可达性就是从若干个GC Roots 出发,能被直接或间接的引用到的,都称为“可达的”(reachable)。
HotSpot定义Root是以一下几个指标为准:
1.当前运行线程的虚拟机栈(其中的操作数栈)中所引用的对象指针。
2.类静态的数据
3.java native 的方法。
如上就是jvm如何解决循环引用的问题。
顺便提一句,为什么JAVA不建议使用finalize()(所谓的析构方法),就是因为如果此方法使用不当(大多数情况下确实如此)会影响GC的可达性判断,使得对象出现起死回生的现象而无法被回收。
------解决方案--------------------
引用计数器这种方式,现在基本上被淘汰了。
现在主要用的是从某个根节点出发,能否访问到这个对象。也就是说,lz担心的,两个孤零零彼此引用的对象,也能正常回收。
java中的循环引用是怎么解决的啊?菜鸟求大神解释,真的想知道。
------解决方案--------------------
你指的是垃圾收集的时候,jvm怎么处理交叉引用的吧?
jvm的垃圾收集有多种机制,不是一言两语能够说清楚,建议看《深入浅出Java虚拟机》此书对垃圾收集有比较详细的描述。
------解决方案--------------------
java jvm的官方实现版本是HotSpot,他 的GC回收是通过可达性算法实现的,而不是通过引用计数器算法。
所谓的可达性就是从若干个GC Roots 出发,能被直接或间接的引用到的,都称为“可达的”(reachable)。
HotSpot定义Root是以一下几个指标为准:
1.当前运行线程的虚拟机栈(其中的操作数栈)中所引用的对象指针。
2.类静态的数据
3.java native 的方法。
如上就是jvm如何解决循环引用的问题。
顺便提一句,为什么JAVA不建议使用finalize()(所谓的析构方法),就是因为如果此方法使用不当(大多数情况下确实如此)会影响GC的可达性判断,使得对象出现起死回生的现象而无法被回收。
------解决方案--------------------
引用计数器这种方式,现在基本上被淘汰了。
现在主要用的是从某个根节点出发,能否访问到这个对象。也就是说,lz担心的,两个孤零零彼此引用的对象,也能正常回收。