聊聊GC Roots 2024-12-04 作者:Hap Tool 写完两个关于GC的文章后,突然想到一个点,无论是哪种垃圾收集器,在寻找存活对象的时候都会用到可达性算法,而所有可达算法的基础引用就是GC Roots。也就是无论是什么算法,GC Roots都是都是我们逃不掉的知识点。 简述 GC roots (short for "Garbage Collection roots") are a fundamental concept in garbage collection (GC) systems, which are used in programming languages like Java, Python, and others that manage memory automatically. GC roots are starting points for tracing object references to determine which objects are still in use (reachable) and should not be garbage-collected. - ChatGPT ChatGPT给的概念是:GC Roots是垃圾收集系统中的基础概念,在Java/Python等语言中都会涉及,他的主要作用就是追踪那些还在被引用且不能进行回收的对象。那在Java中有哪些被用作了GC Roots呢? 运行中线程使用的对象,这个容易理解,因为活动线程使用的对象肯定不能回收。 静态引用 本地变量和方法参数,因为他们存在栈中,不在堆中。可以作为GC Roots JNI引用,为了调用机器原生方法而生成的对象 类加载器的引用 JVM其他的内部引用 示例 public class GCRootExample { // 静态属性引用 static Object staticRoot = new Object(); // GC Root public static void main(String[] args) { // 方法内参数引用 Object localRoot = new Object(); // GC Root (stack reference) doSomething(); } // 静态方法引用 public static void doSomething() { Object methodRoot = new Object(); // GC Root (method stack) // methodRoot is alive only during this method's execution } } 结论垃圾收集器会从GC Roots开始,沿着对象间的引用链进行遍历,标记所有可达的对象。未被标记的对象(即不可达的对象)会被视为垃圾,并在后续的垃圾回收过程中被回收。理解GC Roots对于理解Java的垃圾回收机制非常重要,因为它决定了哪些对象在垃圾回收过程中被认为是仍然活跃的,哪些对象是可以被安全回收的。