在Java中,GCRoot(垃圾回收根)是指在垃圾回收时用来标识哪些对象是可达的、不能被回收的。以下是一些固定可以作为GCRoot的对象的例子:
- 虚拟机栈中的引用:栈帧中的本地变量,尤其是在当前执行的线程中。
public void exampleMethod() {
Object obj = new Object(); // obj是一个GCRoot
}
- 方法区中的类静态属性:被类的静态变量引用的对象。
class MyClass {
static Object staticObject = new Object(); // staticObject是一个GCRoot
}
- 常量池中的引用:在字符串常量池中的字符串对象。
String str = "Hello, World!"; // str引用的字符串常量是GCRoot
-
JNI引用:通过Java Native Interface(JNI)调用原生方法中创建的引用。
-
活动线程:所有活动线程及其栈中的本地变量都会作为GCRoot。例如,当前正在执行的线程及其调用的任何方法中的本地变量。
-
被同步锁(monitor)引用的对象:被
synchronized
锁住的对象。
public class GCRootExample {
static Object staticGCRoot = new Object(); // 静态变量作为GCRoot
public void method() {
Object localGCRoot = new Object(); // 局部变量作为GCRoot
}
public static void main(String[] args) {
String strGCRoot = "Hello"; // 字符串常量作为GCRoot
}
}
在上述代码中,staticGCRoot
是一个静态变量,因此它是一个GCRoot。localGCRoot
是方法中的局部变量,在方法执行时也作为GCRoot。字符串常量strGCRoot
同样作为GCRoot存在于字符串常量池中。
这些对象在垃圾回收时不会被回收,因为它们被认为是可达的。只有当所有的GCRoot对象都不可达时,垃圾回收器才会考虑回收其他对象。
除非注明,否则均为哦豁原创文章,转载必须以链接形式标明本文链接