Java对象回收流程

Posted guanjianzhuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java对象回收流程相关的知识,希望对你有一定的参考价值。

一、可回收对象判断

引用计数器算法:为对象放置一个引用计数器,当对象被引用时则计数器加一,如果一个对象的计数器标识为零的时候,则表明该对象可被回收。这种方法比较简单,但无法解决对象之间互相引用的情况。

GC Roots算法:该方法可以解决上面算法中的对象互相引用无法判断可回收状态的问题。顾名思义,GC Root指的是程序使用对象,总会有一个“入口”,这里可以是栈里的本地变量引用,也可以是方法区中的类静态属性引用、常量引用、JNI的Java引用。当一个对象,如果所有的GC Root沿着对象引用链都到不了,这证明该对象到GC Roots不可达,即该对象没有使用的“入口”,自然是可回收的。

技术分享图片

(图1:GC Roots算法示意图)

如图1,当root3=null的时候,Object5、6、7便到所有root不可达,即使Object6和Object7是互相引用的关系也可以判断为可回收状态。如果想回收Object2,则需要该对象到root1 和 root2的引用链都断了才能回收。

二、对象回收的流程

技术分享图片

(图2:Java对象回收流程图)
 
对象回收流程如上图所示,需要注意的两点为:
1、一个对象GC Roots不可达以及已经执行过finalize方法才可被回收;
2、一个对象的finalize方法只会被执行一次;

以上是关于Java对象回收流程的主要内容,如果未能解决你的问题,请参考以下文章

java什么时候进行垃圾回收,垃圾回收的执行流程

Java 的垃圾回收如何判断哪个对象可以被回收

JAVA 中能否通过程序强迫垃圾回收立即执行?

[Think In Java]基础拾遗1 - 对象初始化垃圾回收器继承组合代理接口抽象类

java 怎么对一个对象强制垃圾回收

关于JVM内存垃圾回收性能调优总结篇