在 Java 虚拟机中,垃圾回收(Garbage Collection,GC)是通过标记-清除、复制、标记-整理等算法来进行的。确定垃圾的核心思想是通过可达性分析,即从一组被称为 GC Roots 的根对象出发,通过对象之间的引用链,找到所有的可达对象,而那些不可达的对象即被认为是垃圾。
GC Roots 是指一组对象,它们被认为是程序中能直接引用到的对象。GC Roots 包括以下几种类型:
-
虚拟机栈(Stack Frames)中的局部变量和输入参数:
- 引用的对象可能在方法调用栈中的局部变量、参数中,只要这些变量或参数是活动的,那么被引用的对象就属于 GC Roots。
-
方法区中的类静态属性引用的对象:
- 静态变量属于类的状态,它随着类的加载而加载,只有当类被卸载时,静态变量引用的对象才会被释放。
-
方法区中常量引用的对象:
- 常量池中的常量,例如字符串常量,被常量引用的对象也属于 GC Roots。
-
本地方法栈中 JNI(Java Native Interface)引用的对象:
- JNI 是 Java 虚拟机调用本地方法的接口,本地方法栈中引用的对象也属于 GC Roots。
在进行垃圾回收时,虚拟机会从这些 GC Roots 开始,通过引用链遍历对象,标记所有与 GC Roots 相连接的对象为存活对象,而没有被标记的对象即被认为是垃圾,将被回收。
这种可达性分析的方式是保证垃圾回收正确性的关键,因为它确保了只有那些能够被程序直接或间接访问到的对象才会被保留,而无法被访问的对象则被认定为垃圾。
Was this helpful?
0 / 0