假设我们使用标记-清除垃圾回收算法,如果我们能够将内存分配标记为“可回收”,这还不够吗?难道程序不知道“可回收”内存基本上是未使用的内存,可以在请求时分配吗?如下图所示,“可回收” block 与“未使用” block 相比有哪些物理差异:
最佳答案
标记 - 在标记阶段,可从 Java 线程、 native 句柄和其他根源访问的所有对象以及可从这些对象等访问的对象都被标记为 Activity 状态。这个过程识别并标记所有仍在使用的对象,其余的可以被认为是垃圾。
扫描 - 在扫描阶段,将遍历堆以查找 Activity 对象之间的间隙。这些间隙记录在空闲列表中,可供新对象分配。
未使用空间与可回收空间 - 未使用的空间只不过是 Activity block 之间的间隙,这些间隙是由于未使用/可回收对象的垃圾收集而创建的,压缩阶段会将未使用的 block 移动到末尾。比较发布图像中的两个图表。
关于java - 为什么我们在标记清除垃圾收集期间需要 "sweep"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60205207/