一、本地变量(栈帧引用)
public class GcRootExample {
public static void main(String[] args) {
// 局部变量num被视为GC Rootint
num = 42;
// ...
}
}
在这个示例中,变量num
是一个局部变量,它被视为 GC Root,因为它位于方法内部的栈帧中。
二、静态变量引用
public class GcRootExample {
// 静态变量obj被视为GC Root
private static SomeObject obj = new SomeObject();
public static void main(String[] args) {
// ...
}
}
在这个示例中,静态变量 obj
引用了一个对象,因此它被视为GC Root。这是因为静态变量在类加载时初始化,并在整个应用程序生命周期内存在。
三、活跃线程
public class GcRootExample {
public static void main(String[] args) {
// 创建一个新线程,并启动它
Thread activeThread = new Thread(() -> {
// 在这个线程中,对象obj被视为GC Root
SomeObject obj = new SomeObject();
// ...
});
activeThread.start();
// ...
}
}
在这个示例中,活跃线程(activeThread
)中的对象obj
被视为GC Root,因为线程对象本身被认为是活跃的,而且线程内的对象是通过该线程访问的。
四、同步锁
public class GcRootExample {
public static void main(String[] args) {
// 创建一个锁对象
Object lock = new Object();
synchronized (lock) {
// 在同步块内,对象obj被视为GC Root
SomeObject obj = new SomeObject();
// ...
}
// ...
}
}
在这个示例中,同步块内的对象obj
被视为GC Root,因为它与同步锁(lock
)相关。
这些示例展示不同情况下可能被视为 GC Root 的对象,包括本地变量、静态变量、活跃线程和同步锁。这些对象起到了阻止垃圾回收器回收其引用的作用,确保了程序的正常执行。