JVM垃圾回收之可达性分析算法与标记清除算法
【摘要】 目前关于垃圾回收这一块, 很多解释都是说引用计数。实际上,Java在垃圾回收这里,远不是引用计数这么简单。它采用的是可达性分析算法。首先在我们的虚拟机里,有一个GC Roots的对象,作为引用的起点,由此节点成树状分散,到达每一个对象。从GC Roots到对象的路径被称为引用链。如下图:( 图片来自互联网,侵删图中,Object 1 2 3 4拥有引用链可以到达GcRoots,也就是说他们为...
目前关于垃圾回收这一块, 很多解释都是说引用计数。
实际上,Java在垃圾回收这里,远不是引用计数这么简单。它采用的是可达性分析算法。
首先在我们的虚拟机里,有一个GC Roots的对象,作为引用的起点,由此节点成树状分散,到达每一个对象。
从GC Roots到对象的路径被称为引用链。
如下图:
( 图片来自互联网,侵删
图中,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)