我只是学了一下编程 2021-06-27 17:26 采纳率: 15.4%
浏览 107

GC Roots 的对象: 虚拟机栈(栈帧中的本地变量表)中引用的对象;各个线程调用方法堆栈中使用

GC Roots 的对象: 虚拟机栈(栈帧中的本地变量表)中引用的对象;各个线程调用方法堆栈中使用到的参数、局部变量、临时变量等。 方法区中类静态属性引用的对象;java 类的引用类型静态变量。 方法区中常量引用的对象;比如:字符串常量池里的引用。 本地方法栈中 JNI(即一般说的 Native 方法)引用的对象。 JVM 的内部引用(class 对象、异常对象 NullPointException、OutofMemoryError,系统类加载器)。(非重点) 所有被同步锁(synchronized 关键)持有的对象。(非重点) JVM 内部的 JMXBean、JVMTI 中注册的回调、本地代码缓存等(非重点) JVM 实现中的“临时性”对象,跨代引用的对象
  • 写回答

1条回答 默认 最新

  • 码农阿豪 Java领域优质创作者 2024-03-06 15:57
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题解答: GC Roots 是垃圾回收算法中用于标记对象是否存活的关键对象,只有被标记为 GC Roots 的对象才会保留,否则就会被垃圾回收器清理掉。下面介绍几种可能成为 GC Roots 的对象:
    1. 虚拟机栈中引用的对象:栈帧中的本地变量表中引用的对象,包括各个线程调用方法堆栈中使用到的参数、局部变量、临时变量等。例如:
    public void test(){
        Object obj = new Object(); // obj 变量存储在虚拟机栈的本地变量表中, obj 对象就是 GC Roots 对象之一
        // 其他代码逻辑
    }
    
    1. 方法区中静态属性引用的对象:方法区中类静态属性引用的对象,即java类的引用类型静态变量。例如:
    public class MyClass {
        private static Object staticObj = new Object(); // staticObj 对象就是 GC Roots 对象之一
    }
    
    1. 方法区中常量引用的对象:方法区中常量引用的对象,如字符串常量池里的引用。例如:
    public class MyClass {
        private final static String MY_NAME = "张三"; // MY_NAME 字符串对象就是 GC Roots 对象之一
    }
    
    1. 本地方法栈中 JNI 引用的对象:本地方法栈中 JNI 引用的对象,即一般说的 Native 方法引用的对象。例如:
    public class MyClass {
        static {
            System.loadLibrary("mylib"); // 加载本地库
        }
        native void test(); // 本地方法
    }
    
    1. JVM 的内部引用:JVM 的内部引用,包括 class 对象、异常对象 NullPointException、OutofMemoryError 和系统类加载器等。例如:
    public class MyClass {
        static {
            ClassLoader classLoader = getClass().getClassLoader(); // classLoader 对象就是 GC Roots 对象之一
        }
    }
    
    1. 所有被同步锁 (synchronized 关键字) 持有的对象:所有被同步锁持有的对象。例如:
    public class MyClass {
        static Object lockObj = new Object();
        public void test() {
            synchronized (lockObj) {
                Object obj = new Object(); // obj 对象就是 GC Roots 对象之一
                // 其他代码逻辑
            }
        }
    }
    

    除上述对象外,还有一些不太常用的对象可能也成为 GC Roots,例如 JVM 内部的 JMXBean、JVMTI 中注册的回调、本地代码缓存等,以及 JVM 实现中的“临时性”对象和跨代引用的对象。但这些都算是非重点的内容。 综上所述,GC Roots 是垃圾回收算法中的重要概念,可能成为 GC Roots 的对象包括:虚拟机栈中引用的对象、方法区中静态属性引用的对象、方法区中常量引用的对象、本地方法栈中 JNI 引用的对象、JVM 的内部引用,以及所有被同步锁持有的对象。

    评论

报告相同问题?

悬赏问题

  • ¥15 用hfss做微带贴片阵列天线的时候分析设置有问题
  • ¥50 我撰写的python爬虫爬不了 要爬的网址有反爬机制
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥120 计算机网络的新校区组网设计
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 海浪数据 南海地区海况数据,波浪数据
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等