目录
- 1. 说明
- 2. 虚拟机栈(栈帧中的局部变量表)中的引用
- 3. 方法区中的类静态属性引用
- 4. 本地方法栈(Native方法栈)中JNI(Java Native Interface)的引用
- 5. 活跃线程(Active Threads)
- 6. Monitor Used(用于同步的监控对象)
- 7. 系统类加载器加载的类
- 8. JVM持有的对象
1. 说明
- 1.在JVM(Java虚拟机)中,GC Roots(垃圾收集根)是垃圾收集器进行可达性分析时,作为起始点的对象集合。
- 2.这些GC Roots对象能够直接或间接持有其他对象的引用,从而确保从它们出发可以遍历到所有存活的对象。
2. 虚拟机栈(栈帧中的局部变量表)中的引用
- 1.局部变量表是线程私有的一部分,存储着方法的局部变量和参数。
- 2.这些局部变量和参数可能持有对堆中对象的引用,因此它们被视为GC Roots。
3. 方法区中的类静态属性引用
- 1.方法区(也称为永久代或元空间)存储着类的元数据信息,包括静态变量。
- 2.这些静态变量可能持有对堆中对象的引用,因此也被视为GC Roots。
4. 本地方法栈(Native方法栈)中JNI(Java Native Interface)的引用
- 1.本地方法栈是JVM为执行本地方法(即非Java代码的方法)而保留的栈空间。
- 2.JNI允许Java代码与本地代码进行交互,本地方法中的局部变量和参数可能持有对Java对象的引用,这些引用也是GC Roots的一部分。
5. 活跃线程(Active Threads)
- 1.正在执行的线程被视为GC Roots,因为它们持有当前执行状态的信息,包括线程栈中的局部变量和参数,这些可能引用堆中的对象。
6. Monitor Used(用于同步的监控对象)
- 1.在Java中,使用synchronized关键字进行同步时,会涉及到监控对象(monitor)。
- 2.这些监控对象在同步过程中可能持有对其他对象的引用,因此也被视为GC Roots。
7. 系统类加载器加载的类
- 1.由系统类加载器(bootstrap class loader或system class loader)加载的类通常不会被垃圾收集器回收,因为这些类对于JVM的运行至关重要。
- 2.这些类及其静态字段也可能持有对堆中对象的引用,因此被视为GC Roots。
8. JVM持有的对象
- 1.JVM可能会为某些特殊目的而保留一些对象,这些对象虽然不直接由用户代码持有,但JVM认为它们是重要的,因此也被视为GC Roots。
- 2.这些对象可能包括系统类加载器、一些重要的异常类、预分配的对象等。