GC Roots是什么?请举例。
GC Roots,或者说垃圾回收根,是垃圾收集器进行垃圾回收时的起始点。在Java中,垃圾回收器通过跟踪GC Roots,找到所有从GC Roots开始的可达对象,这些对象被认为是”存活”的,应该被保留。无法从 GC Roots 达到的对象则认为是”死亡”的,可能会被垃圾回收器回收。
在 Java 中,可以作为 GC Roots 的对象包括以下几种:
- 虚拟机栈(栈帧中的本地变量表)中引用的对象:也就是说,当前线程中的局部变量和输入参数。
-
方法区中类静态属性引用的对象:也就是说,所有的静态变量。
-
方法区中常量引用的对象:也就是说,所有被 final 修饰的常量。
-
本地方法栈中 JNI(即一般说的 Native 方法)引用的对象。
举个例子,假设你有一个类A,类A有一个静态变量B,B引用了一个对象C。在垃圾回收时,类A就是一个GC Roots,因为它是一个包含静态变量的类。垃圾回收器会从类A开始,找到B,然后找到C,因此,C是从GC Roots可达的,不会被垃圾回收器回收。