Java 垃圾回收中方法区静态变量引用是GC Root吗
是,方法区(在 jdk 8 及以后称为元空间)中的类静态变量引用属于 gc root。jvm 在进行垃圾回收时,会从一组被称为 gc roots 的对象开始向下搜索,而全局静态变量、常量以及线程栈上的局部变量等都被纳入这个根集合中。

哪些对象会被标记为 GC Root
除了方法区的静态变量,JVM 还会将活跃线程的栈帧、JNI 引用以及系统类加载器持有的类作为 GC Root。这些对象构成了垃圾回收的起点,确保被它们直接或间接引用的对象不会被回收。

基于程序中某个输入、条件或结果的具体问题
当程序中存在一个指向大对象的静态变量时,该大对象会因静态变量的强引用而无法被回收,即使没有其他代码使用它。这会导致内存泄漏,因为只要类被加载,静态变量就会一直存在。
立即学习“Java免费学习笔记(深入)”;
import java.lang.ref.WeakReference;
public class StaticRefTest {
// 静态变量引用一个大对象
public static byte[] largeData = new byte[10 * 1024 * 1024]; // 10MB
public static void main(String[] args) {
System.out.println("Static variable is referencing the array.");
// 模拟其他操作
for (int i = 0; i < 1000; i++) {
// 做一些事情
}
// 此时 largeData 仍然被 GC Root 引用,无法被回收
System.gc();
System.out.println("After GC, largeData is still alive because it's a static field.");
}
}


















