JVM垃圾收集算法
一.标记-整理(Mark-Compact)
非移动式回收器(例如标记-清理)无法解决的问题之一:再回收之后产生大量的碎片;而标记-整理会对堆内存中存活的对象进行整理,以降低外部的碎片
(1).回收过程
1.标记阶段(Mark)
在标记阶段和Mark-Sweep算法一样,先从根节点进行遍历,标记存过的对象;
2.整理阶段(Compact)
即移动存活的对象;同时更新存活对象中所有指向被移动对象的指针.
3.整理对象有不同的排序方式
在不同的算法中,堆的遍历次数,整理过程所遵循的顺序,对象的迁移方式都有所不同,整理顺序会影响到程序的局部性,移动式回收器(Mark-Compact)重排堆中对象所遵循的顺序有以下3种:
[1].任意顺序:对象的移动方式与他们的原始排列顺序和引用关系无关
[2].线性顺序:将其有关联关系的对象排在一起,如具有引用关系的对象,或者同一数据结构中的相邻数据
[3].滑动顺序:将DVD滑动到堆的一端,"挤出"垃圾, 从而保持对象在堆中原有的分配顺序
所有现代标记-整理回收器均使用的滑动整理顺序,他不改变对象的相对排列顺序;而任意顺序虽然执行速度快,但是他有可能会把相邻的对象分散开,还会降低程序的吞吐量;
(2).有趣理解
这次,垃圾收集机器人不再把餐厅分成两个南北区域了 需要执行垃圾收集任务时,机器人先执行标记-清除算法的第 个步骤,为所有使用中的餐巾纸画好标记,然后,机器人命令所有就餐者带上有标记的餐巾纸向餐厅的南面集中,同时把没有标记的废旧餐巾纸扔向餐厅北面。这样来,机器人只需要站在餐厅北面,怀抱垃圾箱,迎接扑面而来的废旧餐巾纸就行了。
----摘抄自<深入理解JVM+G1+GC>