假设我们正在使用标记清除垃圾收集算法,如果我们能够将内存分配标记为“可回收”,那还不够吗?程序是否不知道“可回收”内存基本上是可以在请求时分配的未使用内存?如图中所示,“可回收”块与“未使用”块之间的物理区别是什么:
Marking-在标记阶段,从Java线程,本机句柄和其他根源可访问的所有对象以及从这些对象可访问的对象等都标记为活动。此过程将识别并标记所有仍在使用的对象,其余对象可以视为垃圾。
Sweeping-在清除阶段,遍历堆以查找活动对象之间的间隙。这些间隔记录在空闲列表中,可用于新对象分配。
未使用与可回收空间-未用空间不过是Alive块之间的间隙,这些间隙是在垃圾回收未使用/可回收对象之后创建的。比较发布图像中的两个图表。