JVM堆中几乎放着Java世界中所有的对象实例,垃圾收集器在对堆内存进行回收前,第一件事情就是要确定这些对象有哪些还存活着,哪些已经死去(即不可能再被任何途径使用的对象)。
在主流的商业程序语言中,Java和c#等都是使用根搜索算法(GC Roots Tracing)判定对象是否存活的。这个算法的基本思路就是通过一系列的名为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连(从GC Roots到这个对象不可达),则证明此对象是不可用的。
在Java中可作为GC Roots的对象包括下面几种:
1、虚拟机栈(栈帧中的本地变量表)中引用的对象;
2、方法区中的类静态属性引用的对象;
3、方法区中的常量引用的对象;
4、本地方法栈中native方法引用的对象;
如果对象在进行根搜索后发现没有与GC Roots相连接的引用链,它将会被第一次标记并且进行一次筛选,筛选的条件是