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

引用计数法

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

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;

jmap -histo pid

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

未断开栈和堆对象的引用

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

jmap -histo pid

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

可达性分析算法

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

JDK1.8中什么是GC Root

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

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

JVM判断对象是否存活相关推荐

  1. 深入理解JVM(三)——JVM之判断对象是否存活(引用计数算法、可达性分析算法,最终判定),Eclipse设置GC日志输出,引用

    本文转载自https://blog.csdn.net/ochangwen/article/details/51406779 本文是基于周志明的<深入理解Java虚拟机> 堆中几乎存放着Ja ...

  2. JVM判断对象是否已死?

    一.引用计数法 给对象添加一个引用计数器,但凡有一个地方引用它,就给计数器的值+1,引用失效就-1:任何时刻计数器为0的对象,不能再被使用了.主流的JVM中没有使用"引用计数法"来 ...

  3. java判断对象已经被回收_Java中JVM判断对象已死的基本算法分析

    原标题:Java中JVM判断对象已死的基本算法分析 jvm中 有各种的垃圾收集器,每个收集器都有各自的算法. 但是一切的根本都需要找到找到应该被消除的对象,理解如何找到死亡对象才是理解垃圾收集器的基础 ...

  4. 垃圾回收器判断对象是否存活

    转载自:http://blog.csdn.net/ochangwen/article/details/51406779 本文是基于周志明的<深入理解Java虚拟机> 堆中几乎存放着Java ...

  5. java中对象的生存期_深入理解Java虚拟机-判断对象是否存活算法与对象引用

    我们知道Java中的对象一般存放在堆中,但是总不能让这些对象一直占着内存空间,这些对象最终都会被回收并释放内存,那么我们如何判断对象已经成为垃圾呢?这篇文章会提出两种算法解决这个问题.另外,本文还要谈 ...

  6. bat判断文件是否存在_BAT面试必问题系列:JVM判断对象是否已死和四种垃圾回收算法总结...

    JVM系列: 面试题一:判断对象是否已死 判断对象是否已死就是找出哪些对象是已经死掉的,以后不会再用到的,就像地上有废纸.饮料瓶和百元大钞,扫地前要先判断出地上废纸和饮料瓶是垃圾,百元大钞不是垃圾.判 ...

  7. 如何判断对象是否存活之根搜索算法

    根搜索算法有没有人了解过的,在垃圾回收机制里面判断对象存活,主要是使用根搜索算法进行实现的,根搜索算法可能稍微有点抽象,算法是怎么进行实现的,又叫GCRoots,类似于树形结构一样的,他怎么样进行实现 ...

  8. 如何判断对象是否存活之引用计数发

    垃圾回收机制是怎么判断一个对象是否存活的,为什么要讲这个呢,这个讲完你就明白,新生代是怎么做晋升的,他的存活有几个方向点,垃圾回收对象是怎么判断存活的,哪几种,首先第一种引用计数法,根搜索法,GC r ...

  9. 三、垃圾收集之判断对象是否存活

    2019独角兽企业重金招聘Python工程师标准>>> 一.引用计数算法 当有一个地方引用这个对象时,计数器加1 当引用失效时,计数器减1 当计数器为0时,则对象死亡,等待回收 二. ...

最新文章

  1. 国内42所一流大学综合排名出炉!清北之后谁是国内第三?
  2. 信息理论基础 周炯槃 常迥
  3. 某一列高度变化_高度近视,老了后会瞎吗?
  4. 草履虫纳米机器人_激光驱动的机器人大军!Nature:机器人尺寸小于 0.1 毫米,4 英寸晶圆可容纳 100 万个...
  5. java lombok
  6. 多功能复合机基于用户认证功能的实现过程详解
  7. 【转】如何在 Visual Studio 2019 中连接中国版 Azure
  8. jsp中获取list长度
  9. java记住用户名和密码_JAVA--高级基础开发Cookie实现记住用户名和密码
  10. Microsoft.NET Pet Shop 4.0各个模块之间的联系
  11. 【chrome插件】web版微信接入图灵机器人API实现自动回复
  12. Win7系统下解决VB6.0鼠标滚轮支持
  13. 什么是工业机器人,工业机器人的分类与特点
  14. CWE-476: NULL Pointer Dereference(空指针间接引用)
  15. 对话系统-口语理解-意图检测和槽填充:A Co-interactive Transformer for joint Slot Filling and Intent Detection
  16. Internet网络行为学
  17. 芝加哥大学计算机博士年薪,2020年芝加哥大学博士含金量
  18. 哈佛大学幸福课笔记一
  19. 撤销性CP-ABE方案研究现状总结 - 2021
  20. dva的用法_dva.js初探

热门文章

  1. 关于大小端、位域的一些概念详解
  2. 注意:不能将文件名叫做email.py,否则会报 ImportError: No module named mime.text
  3. 滨江学院 刘生 计算机网络考点知识点整理
  4. 1006. 换个格式输出整数 (15)-PAT乙级真题
  5. 蓝桥杯 ALGO-31算法训练 开心的金明(01背包,动态规划)
  6. 安装python时需要勾选_工业洗衣机安装时需要注意什么?
  7. 如何聊离职原因,向面试官展示自己的忠诚
  8. Window2003 IIS+MySQL+PHP+Zend环境配置
  9. Linux 文件夹和文件大小排序
  10. Unity3d面向英特尔 x86 平台的 Unity* 优化指南: 第 2 部分