众所周知,我们目前最常用的虚拟机hotspot使用可达性分析来进行垃圾回收,而可达性分析需要依赖GC Root。下面我就来介绍下可以作为GC Root的对象。
(一)虚拟机栈中引用的对象
虚拟机栈中的引用的对象可以作为GC Root。我们程序在虚拟机的栈中执行,每次函数调用调用都是一次入栈。在栈中包括局部变量表和操作数栈,局部变量表中的变量可能为引用类型(reference),他们引用的对象即可作为GC Root。不过随着函数调用结束出栈,这些引用便会消失。
(二)方法区中类静态属性引用的对象
简单的说就是我们在类中使用的static声明的引用类型字段,例如:
Class Dog {private static Object tail;
}
(三)方法区中常量引用的对象
简单的说就是我们在类中使用final声明的引用类型字段,例如:
Class Dog {private final Object tail;
}
(四)本地方法栈中引用的对象
就是程序中native本地方法引用的对象。