JVM学习——Gc Roots

JVM学习——Gc Roots 一、GC Roots 通俗理解GC Roots垃圾回收根节点是 Java 垃圾回收GC机制的核心判断依据可以把它理解成JVM 内存中 “不会被回收的固定锚点”所有能直接 / 间接被 GC Roots 引用的对象都是 “存活对象”反之无法被 GC Roots 关联的对象就是 “垃圾对象”会被 GC 清理。打个比方GC Roots 就像大树的 “主根”所有和主根相连的 “枝干 / 叶子”对象引用都是活的断了连接的叶子就会被清理。二、GC Roots 包含哪些类型核心分类只有以下几类对象能成为 GC Roots记这 4 类核心即可虚拟机栈栈帧中的局部变量 / 参数比如方法执行时方法里定义的对象引用User user new User()中的 user只要方法还在运行这个引用就是 GC Roots。方法区中的静态变量类的静态成员变量public static User instance;因为类的静态变量属于类本身类加载后一直存在所以是 GC Roots。方法区中的常量引用比如字符串常量池里的常量final String NAME 张三常量不会被回收对应的引用也是 GC Roots。本地方法栈中的本地方法JNI引用调用 C/C 本地方法时本地方法持有的 Java 对象引用比如 Java 调用 Native 方法传递的对象。三、GC Roots 工作原理publicclassGCRootsDemo{// 静态变量 → 属于 GC RootspublicstaticUserstaticUsernewUser();publicvoidtest(){// 局部变量 → 属于 GC Roots方法执行时UserlocalUsernewUser();// 临时变量 → 方法执行完后localUser 出栈不再是 GC RootslocalUsernull;}}classUser{}staticUser是静态变量永远属于 GC Roots它引用的User对象不会被回收localUser在test()方法执行时是 GC Roots方法执行结束后localUser从栈帧中消失若此时没有其他引用指向这个User对象该对象就会被判定为垃圾。