为什么在mark-sweep垃圾收集期间需要“sweep”?

6l7fqoea  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(280)

假设我们使用的是mark-sweep垃圾回收算法,如果我们能够将内存分配标记为“可回收”,这还不够吗?难道程序不知道“可回收”内存基本上是未使用的内存,可以在请求时分配吗?如图所示,“可回收”区块与“未使用”区块之间的物理区别是什么:

daolsyd0

daolsyd01#

标记-在标记阶段,所有可从java线程、本机句柄和其他根源访问的对象以及可从这些对象访问的对象等都标记为活动的。这个过程识别并标记所有仍在使用的对象,其余的可以视为垃圾。
扫描-在扫描阶段,遍历堆以查找活动对象之间的间隙。这些间隙记录在自由列表中,可用于新对象分配。
未使用空间与可回收空间-未使用空间只不过是活动块之间的间隙,这些间隙是由于未使用/可回收对象的垃圾收集而产生的,压缩阶段会将未使用的块移到最后。比较张贴的图片中的两个图表。

gajydyqb

gajydyqb2#

“扫荡”只是“另一种”推迟“停止世界杯”的方式。当然,理论上这是件好事。在做标记的同时,也要跟踪这个“自由”的空间,在那里已经确认了死物。因此,您可以在下次分配时使用这些列表中的信息。
问题是,当您使用 sweep 仅当没有连续的可用空间可供分配时(基于这些可用列表信息),仍将执行压缩阶段。
我的最后一点是 CMS 是不赞成,没有人支持,所以了解它做什么可能是有趣的,但不是真正有价值的;因为其他gc的做法不同。

相关问题