GC Roots
在Java中,垃圾收集(GC)是自动进行的,它帮助程序开发者免于手动管理内存,减少内存泄漏和溢出的风险。为了有效地执行垃圾收集,Java虚拟机(JVM)需要知道哪些对象是可达的,即从某个根节点开始,可以通过引用链找到的对象。这些根节点被称为“GC Roots”。
GC Roots的用途
GC Roots的主要用途是作为垃圾收集过程中对象可达性分析的起点。可达性分析(Reachability Analysis)是一种判断对象是否可达的方法,即检查对象是否在引用链上,从而确定该对象是否还被需要。如果一个对象从GC Roots开始无法通过任何引用链到达,则认为这个对象是不可达的,垃圾收集器就可以安全地回收这个对象所占用的内存。
哪些元素会作为GC Roots
在Java中,通常以下元素可以作为GC Roots:
- 类静态属性引用的对象:类的静态字段不属于任何实例,因此它们从属于Java类。
- 活跃的Java线程:所有正在执行的线程。
- 方法区中类的常量引用的对象:这包括静态常量。
- 本地方法栈中JNI(即通常所说的Native方法)的引用对象:例如,由Java代码调用的本地C或C++代码中的对象。
- Java栈帧中的局部变量表引用的对象:即所有局部变量。
为什么选取这些元素
选取这些元素作为GC Roots主要是