Java OpenResty Spring Spring Boot MySQL Redis MongoDB PostgreSQL Linux Android Nginx 面试 小程序 Arthas JVM AQS juc Kubernetes Docker DevOps


Java 中的 GC Roots

Java GC 面试 大约 1244 字

判断是否会被回收

Java使用的是可达性分析法,为了解决引用计数法的循环引用问题。

  1. 引用计数法
  2. 枚举根节点做可达性分析(根搜索路径)

基本思想

GC Root的对象为根节点,向下搜索。如果一个对象到GC Root没有任何引用链相连时,则说明此对象不可用。

GC Root对象

哪些可以作为GC Root对象:

  • System Class:由自举/系统类加载器加载的类。例如:rt.jar中所有诸如java.util.*的类。
  • JNI Local:native代码中的本地变量。例如:用户定义的JNI代码或JVM内部代码。
  • JNI Global:native代码中的全局变量。例如:用户定义的JNI代码或JVM内部代码。
  • Thread Block:当前活跃的线程块中引用的对象。
  • Thread:启动且未停止的线程(包括main线程)。
  • Busy Monitor:其wait()notify()方法被调用,或被同步synchronized的对象。例如:通过调用synchronized(Object)或者进入其某个synchronized方法。静态方法对应类,非静态方法对应对象。
  • Java Local:本地变量。例如:仍在线程的栈中的方法输入参数或本地创建的对象。
  • Native Stack:native代码的入或出参数。通常发生在许多方法有native部分,方法参数处理的对象成为GC根对象。例如:参数用于文件、网络I/O或反射。
  • Finalizer:在队列中等待其finalizer运行的对象。
  • Unfinalized:拥有finalize方法,但是还没有被终结且不在finalizer队列的对象。
  • Unreachable:从其他根对象不可达的对象,但是被内存分析器标记为根对象。
  • Unknown:没有根类型的对象。一些转储(dump),例如:IBM可移植对转储文件,没有根信息。对于这些转储,内存分析器解析程序将没有被其他根对象引用的对象标记为此类根对象。
public class GcRootDemo {
    // 成员变量是虚拟机栈引用的对象
    private int[] array = new int[10];
    // 静态属性是类静态属性引用的对象
    public static Object o = new Object();
    // 常量引用的对象
    public static final String S = "abc";
    // 成员方法是虚拟机栈顶引用的对象
    public void testMethod() {
        GcRootDemo gcRootDemo = new GcRootDemo();
    }
}

参考

http://help.eclipse.org/indigo/topic/org.eclipse.mat.ui.help/concepts/gcroots.html

阅读 476 · 发布于 2022-05-19

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb

扫描下方二维码关注公众号和小程序↓↓↓

扫描二维码关注我
昵称:
随便看看 换一批