专栏首页JVMGCJVM判断对象是否存活
原创

JVM判断对象是否存活

  • 引用计数法
  • 可达性分析算法

引用计数法

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

image-20201026000140158
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设置参数

-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查看堆内的对象

断开栈和堆对象的引用

objA = null;
objB = null;
image-20201026000510405

jmap -histo pid

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

未断开栈和堆对象的引用

//objA = null;
//objB = null;

jmap -histo pid

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

可达性分析算法

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

img

JDK1.8中什么是GC Root

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

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

wx.jpg

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java 13 - 判断对象是否存活

    程序计数器, 虚拟机栈, 本地方法栈属于线程私有, 只存在于线程的生存周期内, 线程结束也就跟着消失了, 因此不需要对上述空间进行垃圾回收. 只需要考虑方法区和...

    Reck Zhang
  • 如何判断Javascript对象是否存在

    Javascript语言的设计不够严谨,很多地方一不小心就会出错。 举例来说,请考虑以下情况。 现在,我们要判断一个全局对象myObj是否存在,如果不存在,就对...

    ruanyf
  • Python判断对象是否是functio

    有时候用python就有这么一种感悟,各种钩子函数就是通过内置的“__”属性实现,python学得好不好,就是对“__”属性理解得透彻不透彻。

    py3study
  • 深入理解JVM(③)判断对象是否还健在?

    因为Java对象主要存放在Java堆里,所以垃圾收集器(Garbage Collection)在对Java堆进行回收前,第一件事情就是要确定这些对象之中哪些还“...

    纪莫
  • 判断一个对象是否是空

    用户4973967
  • js判断一个对象Object是否为空对象

    Tiffany_c4df
  • JVM 引用计数法 & 引用链法详细解析:如何判断一个Java对象是否存活

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    Carson.Ho
  • JVM真香系列:如何判断对象是否可被回收?

    在JVM中程序寄存器、Java虚拟机栈、本地方法栈,这三个区是随着线程的创建而创建,随着线程结束而销毁。

    田维常
  • JS——判断一个对象是否为空

    判断一个对象是否为空对象,本文给出三种判断方法: 1.最常见的思路,for...in...遍历属性,为真则为“非空数组”;否则为“空数组” ?  2.通过JSO...

    李文杨
  • 六、垃圾回收_判断对象是否存活算法_引用计数法详解

      在对象中添加一个引用计数器,当有地方引用对象的时候,引用计数器的值就+1 ,当引用失效的时候计数器的值就 -1

    梅花
  • js 判断一个 object 对象是否为空

    1.最常见的思路,for...in... 遍历属性,为真则为“非空数组”;否则为“空数组”

    FungLeo
  • js判断对象是否为空对象的几种方法

    1.将json对象转化为json字符串,再判断该字符串是否为"{}" var data = {}; var b = (JSON.stringify(data) ...

    TimothyJia
  • 七、垃圾回收_判断对象是否存活算法_可达性分析法详解

    梅花
  • jvm垃圾回收之引用计数算法和可达性分析算法(判断对象是否存活算法

    什么是引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值加1;当引用失效时,计数器值减1,引用数量为0的时候,则说明对象没有被任何引用指...

    黎明大大
  • 如何判断电脑是否激活

    想知道电脑是否激活其实并不难知道,用鼠标右键在“此电脑”上选择属性,能够直接看到Windows的激活状态。

    java后端指南
  • 深入Java虚拟机--判断对象存活状态

    程序计数器,虚拟机栈和本地方法栈 首先我们先来看下垃圾回收中不会管理到的内存区域,在Java虚拟机的运行时数据区我们可以看到,程序计数器,虚拟机栈,本地方法栈...

    九灵
  • 41:判断元素是否存在

    41:判断元素是否存在 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB描述 有一个集合M是这样生成的: (1) 已知 k 是集...

    attack
  • python 判断属性是否存在

    py3study
  • js判断方法是否存在

    似水的流年

扫码关注云+社区

领取腾讯云代金券