前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JVM判断对象是否存活

JVM判断对象是否存活

原创
作者头像
开源日记
修改2020-12-04 10:56:39
6380
修改2020-12-04 10:56:39
举报
文章被收录于专栏:JVMGCJVMGC
  • 引用计数法
  • 可达性分析算法

引用计数法

给对象添加一个引用计数器,每当有一个地方引用,计数器就加1,当引用失效,计数器减1,计数器为0的对象没有被使用,Java中没有使用引用计数法,原因是引用计数法无法解决对象间的循环引用问题。

image-20201026000140158
image-20201026000140158
代码语言:txt
复制
package com.rumenz;
public class Testy {
    public Object instance = null;
    public static void main(String[] args) throws InterruptedException {
        Testy objA = new Testy();
        Testy objB = new Testy();
        objA.instance = objB;
        objB.instance = objA;
        objA = null;
        objB = null;
        //假设在这行发生了gc,objA和objB是否被回收
        System.gc();
        //拖延时间查看堆内存对象
        Thread.sleep(50000);
    }
}

VM设置参数

代码语言:txt
复制
-XX:+PrintGCDetails -XX:-UseAdaptiveSizePolicy -XX:SurvivorRatio=8 -XX:NewSize=10M -XX:MaxNewSize=10M

-XX:+PrintGCDetails 启用日志

-XX:-UseAdaptiveSizePolicy 禁用动态调整,使SurvivorRatio可以起作用

-XX:SurvivorRatio=8 设置Eden:Survivior=8

-XX:NewSize=10M -XX:MaxNewSize=10M 设置整个新生代的大小为10M

使用jmap -histo pid查看堆内的对象

断开栈和堆对象的引用

代码语言:txt
复制
objA = null;
objB = null;
image-20201026000510405
image-20201026000510405

jmap -histo pid

堆中未发现com.rumenz.Testy对象。虽然objAobjB存在相互引用,但是由于栈和堆对象没有了引用关系, 垃圾回收时将objAobjB回收掉,说明JVM虚拟机未使用引用计数法来判断对象是否存活。

未断开栈和堆对象的引用

代码语言:txt
复制
//objA = null;
//objB = null;

jmap -histo pid

堆中发现com.rumenz.Testy对象。因为对象还在使用着。

可达性分析算法

GC Root对象为起点,从这些对象为起点,往下搜索,走过的路径为引用连,当一个对象到GC Roots没有任何引用连引用,则证明此对象没有被用到,将会被JVM判定为垃圾。

img
img

JDK1.8中什么是GC Root

  • 虚拟机栈中(栈帧中的本地变量表)中引用的对象。
  • 元数据区类静态属性引用的对象
  • 元数据区常量引用的对象
  • 本地方法栈(Native)方法引用的对象

相对于引用计数法,可达性分析避免了循环导致的问题。同时具备执行搞笑的特点。也是JVM采用的标记算法。

wx.jpg
wx.jpg

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引用计数法
    • 断开栈和堆对象的引用
      • 未断开栈和堆对象的引用
      • 可达性分析算法
        • JDK1.8中什么是GC Root
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档