java - 为什么我们在标记清除垃圾收集期间需要 "sweep"?

标签 java garbage-collection

假设我们使用标记-清除垃圾回收算法,如果我们能够将内存分配标记为“可回收”,这还不够吗?难道程序不知道“可回收”内存基本上是未使用的内存,可以在请求时分配吗?如下图所示,“可回收” block 与“未使用” block 相比有哪些物理差异: enter image description here

最佳答案

标记 - 在标记阶段,可从 Java 线程、 native 句柄和其他根源访问的所有对象以及可从这些对象等访问的对象都被标记为 Activity 状态。这个过程识别并标记所有仍在使用的对象,其余的可以被认为是垃圾。

扫描 - 在扫描阶段,将遍历堆以查找 Activity 对象之间的间隙。这些间隙记录在空闲列表中,可供新对象分配。

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

关于java - 为什么我们在标记清除垃圾收集期间需要 "sweep"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60205207/

相关文章:

c++ - `std::shared_ptr`自动循环断路器的可行性

c# - Component类库中实现的Dispose方法在哪里

java - 有效的Java项目7 : Avoid Finalizers

java - Spring 安全 OAuth stackoverflowException

Java 部署到云端以实现快速计算

java - 从消费者组中获取Kafka消费者列表

java - 无法使用 NetBeans 和 Glassfish 服务器部署 WebService

java - 删除键时如何从 LinkedHashMap 对象中删除监听器

javascript - ExtJS 是否自动垃圾收集组件

java - 当 java.net.preferIPv4Stack=true 时,无法对 IPv6 使用 InetAddress.isReachable(timeout)