众所周知,Java与C++相比有一个明显的不同就是:Java拥有自动垃圾回收机制,而C++的垃圾回收则完全由程序员自己手动完成,这不仅对程序员本身素质有一定的要求,还提高了内存泄漏的风险。
以下内容参考《深入理解Java虚拟机》一书,经过自己理解整理而来,欲知完整全面的内容,请参看原著。
如何判断一个对象已经“死亡”
首先,我们需要知道JVM如何判断一个对象已经“死亡”了,答案是:可达性分析算法。
此算法的基本思想是:通过一系列的被称为“GC Roots”的对象作为起点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,如果某个对象到GC Roots不与任何引用链相连,则表示此对象不可用。
在Java中,GC Roots对象包括以下几种:
- 局部变量表中引用的对象(方法中的参数,方法体中的局部变量);
- 方法区中类静态属性引用的对象(static);
- 方法区中常量引用的对象(final static);
- 本地方法栈中JNI引用的对象(native方法)。
从上面的范围我们可以看出来,基本上除了成员变量引用的对象外,其余引用对象的方式均可作为GC Roots。
垃圾回收简要过程
这里必须点出一个很重要的误区:不可达的对象并不会马上就会被直接回收,而是至少要经过两次标记的过程。