可达性分析算法

目前主流的商用JVM都是通过可达性分析来判断对象是否可以被回收的。

这个算法的基本思路是:

通过一系列被称为「GC
Roots」的根对象作为起始节点集,从这些节点开始,通过引用关系向下搜寻,搜寻走过的路径称为「引用链」,如果某个对象到GC
Roots没有任何引用链相连,就说明该对象不可达,即可以被回收

初看这段话是不是一脸懵呢?笔者当初也是的,完全不知道什么意思,后面才慢慢理解。

要想理解可达性算法,首先要想明白几个问题:

1、什么是对象可达?

对象可达指的就是:双方存在直接或间接的引用关系。 根可达或GC Roots可达就是指:对象到GC Roots存在直接或间接的引用关系。

如下代码:

public class MyObject {private String objectName;//对象名private MyObject refrence;//依赖对象public MyObject(String objectName) {this.objectName = objectName;}public MyObject(String objectName, MyObject refrence) {this.objectName = objectName;this.refrence = refrence;}public static void main(String[] args) {MyObject a = new MyObject("a");MyObject b = new MyObject("b");MyObject c = new MyObject("c");a.refrence = b;b.refrence = c;new MyObject("d", new MyObject("e"));}
}

创建了5个对象,他们之间的引用关系如图:

假设a是GC Roots的话,那么b、c就是可达的,d、e是不可达的。

2、GC Roots是什么?

垃圾回收时,JVM首先要找到所有的GC Roots,这个过程称作 「枚举根节点」 ,这个过程是需要暂停用户线程的,即触发STW。
然后再从GC Roots这些根节点向下搜寻,可达的对象就保留,不可达的对象就回收。

那么,到底什么是GC Roots呢?

GC Roots就是对象,而且是JVM确定当前绝对不能被回收的对象(如方法区中类静态属性引用的对象 )。
只有找到这种对象,后面的搜寻过程才有意义,不能被回收的对象所依赖的其他对象肯定也不能回收嘛。

当JVM触发GC时,首先会让所有的用户线程到达安全点SafePoint时阻塞,也就是STW,然后枚举根节点,即找到所有的GC
Roots,然后就可以从这些GC Roots向下搜寻,可达的对象就保留,不可达的对象就回收。

即使是号称几乎不停顿的CMS、G1等收集器,在枚举根节点时,也是要暂停用户线程的。

GC Roots是一种特殊的对象,是Java程序在运行过程中所必须的对象,而且是根对象。

那么,哪些对象可以成为GC Roots呢?

3、哪些对象可以作为GC Roots?
可以作为GC Roots的对象可以分为两大类:全局对象和执行上下文。

下面就一起来理解一下为什么这几类对象可以被作为GC Roots。
1、方法区静态属性引用的对象
全局对象的一种,Class对象本身很难被回收,回收的条件非常苛刻,只要Class对象不被回收,静态成员就不能被回收。

2、方法区常量池引用的对象
也属于全局对象,例如字符串常量池,常量本身初始化后不会再改变,因此作为GC Roots也是合理的。

3、方法栈中栈帧本地变量表引用的对象
属于执行上下文中的对象,线程在执行方法时,会将方法打包成一个栈帧入栈执行,方法里用到的局部变量会存放到栈帧的本地变量表中。只要方法还在运行,还没出栈,就意味这本地变量表的对象还会被访问,GC就不应该回收,所以这一类对象也可作为GC Roots。

4、JNI本地方法栈中引用的对象
和上一条本质相同,无非是一个是Java方法栈中的变量引用,一个是native方法(C、C++)方法栈中的变量引用。

5、被同步锁持有的对象
被synchronized锁住的对象也是绝对不能回收的,当前有线程持有对象锁呢,GC如果回收了对象,锁不就失效了嘛。

尾巴
总结,可达性分析就是JVM首先枚举根节点,找到一些为了保证程序能正常运行所必须要存活的对象,然后以这些对象为根,根据引用关系开始向下搜寻,存在直接或间接引用链的对象就存活,不存在引用链的对象就回收。

jvm之可达性分析算法相关推荐

  1. JVM:可达性分析算法

    在堆里存放着几乎多有的java对象实例,垃圾搜集器在对堆进行回收之前,第一件事情就是确定这些对象之中哪些还"存活"着(即通过任何途径都无法使用的对象). 一.可达性分析算法 在Ja ...

  2. JVM 垃圾回收算法 -可达性分析算法!!!高频面试!!!

    前言:学习JVM,那么不可避免的要去了解JVM相关的垃圾回收算法,本文只是讲了讲了可达性分析算法,至于标记-清除.标记-复制,标记-整理,分代收集等等算法,会在近两天的文章中陆续更新出来. 很喜欢一句 ...

  3. 引用计数器法 可达性分析算法_面试官:你说你熟悉jvm?那你讲一下并发的可达性分析...

    持续输出原创文章,点击蓝字关注我吧 上面这张图是我还是北漂的时候,在鼓楼附近的胡同里面拍的. 那天刚刚下完雨,路过这个地方的时候,一瞬间就被这五颜六色的门板和自行车给吸引了,于是拍下了这张图片.看到这 ...

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

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

  5. JVM——引用计数算法与可达性分析算法

    前几篇博客我们一起认识了JVM的内存模型(程序计数器.虚拟机栈.本地方法栈.方法区与堆),了解了它们的内存结构与分配,同时也略带提到关于内存的回收. JVM--内存模型(一):程序计数器 JVM--内 ...

  6. 【JVM】引用计数和可达性分析算法详解

    前言 JVM堆中几乎存放了所有对象的实例,那么垃圾收集器怎么确定哪些对象还"存活"着,哪些已经"死去"呢?本文主要介绍判断对象是否存活算法引用计数算法和可达性分 ...

  7. JVM—引用计数和可达性分析算法(存活性判断)

    1 引用计数算法 1.1 算法思想   给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:   当引用失效时,计数器值就减1:   任何时候计数器为0时的对象就是不能再被使用. 1. ...

  8. 【Java 虚拟机原理】垃圾回收算法 ( 可达性分析算法 | GC Root 示例 | GC 回收前的两次标记 | finalize 方法示例 )

    文章目录 一.可达性分析算法 二.GC Root 示例 三.GC 回收前的两次标记 四.finalize 方法示例 一.可达性分析算法 在 堆内存 中 , 存在一个 根对象 GC Root , GC ...

  9. 31. 如何计算对象已死(引用计数器算法、可达性分析算法)32.对象是否可 GC?33. Minor GC 和 Full GC

    31. 如何计算对象已死 31.1.引用计数器算法 引用计数器算法是给每个对象设置一个计数器,当有地方引用这个对象的时候,计数器+1,当引用失效的时候,计数器-1,当计数器为0的时候,JVM就认为对象 ...

  10. 3.内存分配、逃逸分析与栈上分配、直接内存和运行时常量池、基本类型的包装类和常量池、TLAB、可达性分析算法(学习笔记)

    3.JVM内存分配 3.1.内存分配概述 3.2.内存分配–Eden区域 3.3.内存分配–大对象直接进老年代 3.3.1.背景 3.3.2.解析 3.4.内存分配–长期存活的对象进去老年代 3.5. ...

最新文章

  1. 蚂蚁金服付志嵩:数据膨胀?关系复杂?如何升级图数据库?
  2. 清空SQL Server数据库日志的SQL语句
  3. python3 list 列表 方法说明
  4. JS中apply和call的联系和区别
  5. Java命令行界面(第1部分):Apache Commons CLI
  6. Git----分支管理之分支管理策略04
  7. spingMVC post 提交乱码问题
  8. 大数据开发笔记(八):Sparkstreaming
  9. 【时间序列分析】16.平稳序列的决定性
  10. msm8953 PWM背光
  11. 高级API快速入门之多线程01【07】
  12. Latex显示无限循环小数
  13. python爬取网易云音乐热评_python爬取网易云音乐评论
  14. B站哔哩哔哩:11 月 22 日上午九时正起恢复在香港联交所买卖
  15. 【中亦安图】风险提醒之Oracle RAC高可用失效(2)
  16. 基于ssm框架的农产品扶农商农平台的设计与实现
  17. Silverlight+WCF 新手实例 象棋 主界面-棋谱-回放-结局(四十)
  18. 曲线救国的就业路线是否合理?
  19. 【Py】pyecharts数据可视化案例——地下室空气治理
  20. UnityShader学习笔记 Unity的表面着色器

热门文章

  1. 【汉化】使用gettext和poedit对xibo-mo文件进行汉化编辑
  2. itextpdf字体编码研究
  3. 第3章-线性概率模型(1)-logistics/probit模型
  4. 如何选择适合的伺服电机?
  5. 六自由度机械臂仿真设计|包括UR5|Puma|victor5|运动学正逆解介绍|MATLAB机器人工具箱|Adams仿真
  6. linux给用户user1设置密码,Linux用户管理之useradd、passwd命令讲解
  7. 某新闻App sign签名算法解析(一)
  8. #笔记#圣思园 JavaSE 第29讲——String类源代码深析
  9. 草图大师SketchUp pro 2018中文版
  10. 联通bss转cbss_携号转网山西联通经业务系统受理的首张携入号码开卡成功