GC Roots是什么?请举例。

GC Roots,或者说垃圾回收根,是垃圾收集器进行垃圾回收时的起始点。在Java中,垃圾回收器通过跟踪GC Roots,找到所有从GC Roots开始的可达对象,这些对象被认为是”存活”的,应该被保留。无法从 GC Roots 达到的对象则认为是”死亡”的,可能会被垃圾回收器回收。

在 Java 中,可以作为 GC Roots 的对象包括以下几种:

  1. 虚拟机栈(栈帧中的本地变量表)中引用的对象:也就是说,当前线程中的局部变量和输入参数。

  2. 方法区中类静态属性引用的对象:也就是说,所有的静态变量。

  3. 方法区中常量引用的对象:也就是说,所有被 final 修饰的常量。

  4. 本地方法栈中 JNI(即一般说的 Native 方法)引用的对象

举个例子,假设你有一个类A,类A有一个静态变量B,B引用了一个对象C。在垃圾回收时,类A就是一个GC Roots,因为它是一个包含静态变量的类。垃圾回收器会从类A开始,找到B,然后找到C,因此,C是从GC Roots可达的,不会被垃圾回收器回收。

发表评论

后才能评论