JVM垃圾回收之可达性分析算法与标记清除算法

举报
Tsln 发表于 2019/01/18 13:34:21 2019/01/18
【摘要】 目前关于垃圾回收这一块, 很多解释都是说引用计数。实际上,Java在垃圾回收这里,远不是引用计数这么简单。它采用的是可达性分析算法。首先在我们的虚拟机里,有一个GC Roots的对象,作为引用的起点,由此节点成树状分散,到达每一个对象。从GC Roots到对象的路径被称为引用链。如下图:( 图片来自互联网,侵删图中,Object 1 2 3 4拥有引用链可以到达GcRoots,也就是说他们为...

目前关于垃圾回收这一块, 很多解释都是说引用计数。

实际上,Java在垃圾回收这里,远不是引用计数这么简单。它采用的是可达性分析算法。

首先在我们的虚拟机里,有一个GC Roots的对象,作为引用的起点,由此节点成树状分散,到达每一个对象。

从GC Roots到对象的路径被称为引用链。

如下图:

( 图片来自互联网,侵删

下载.png

图中,Object 1 2 3 4拥有引用链可以到达GcRoots,也就是说他们为存活的对象,而5 6 7并没有可以到达GcRoots的引用链,则他们为可回收对象。

JVM在运行时会在特殊位置出发中断点,例如上下文切换、线程Sleep、内存区满、抛出异常。

中断点一旦出发,JVM会立即对内存区域进行GC Roots检测,而GC有分为局部GC和完全GC (Full GC)。

局部GC对GC Roots部分进行检测,而完全GC对整个GC Roots检测。无Root引用的内存区将经历标记清除算法:

标记清除算法将检测内存区的GC标记,如无GC标记则为第一次发现,JVM会调用该内存区对象的finailze方法通知对象将被回收。如有GC标记则直接回收内存 (这就是finailze方法仅被调用一次的原因^_^)


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。