首页 > 解决方案 > 为什么我们需要在标记清扫垃圾收集期间进行“清扫”?

问题描述

假设我们正在使用标记清除垃圾收集算法,如果我们能够将内存分配标记为“可回收”,这还不够吗?难道程序不知道“可回收”内存基本上是可以在请求时分配的未使用内存吗?如图所示,“可回收”块与“未使用”块之间的物理差异是什么: 在此处输入图像描述

标签: javagarbage-collection

解决方案


标记- 在标记阶段,所有可从 Java 线程、本机句柄和其他根源访问的对象都被标记为活动的,以及可从这些对象访问的对象等等。此过程识别并标记所有仍在使用的对象,其余的可以视为垃圾。

清扫- 在清扫阶段,遍历堆以查找活动对象之间的间隙。这些间隙记录在空闲列表中,可用于新的对象分配。

未使用与可回收空间 - 未使用空间只不过是活动块之间的间隙,这些间隙是由于未使用/可回收对象的垃圾收集而创建的,压缩阶段会将未使用的块移动到最后。比较发布的图像中的两个图表。


推荐阅读