multithreading - 垃圾收集并发
问题描述
为什么简单的标记和扫描算法不能同时进行。
我读过我们需要 CMS(并发标记和清除算法)来进行并发垃圾收集,它比简单的标记和清除算法更复杂,但是我们需要 CMS 的简单算法有什么问题?
解决方案
最简单的原因是,如果对象的路径发生更改,标记可能会错过一些可到达的对象。考虑以下程序和场景:
a = new Object();
b = new Object();
b.c = new Object();
// gc process marks a, nothing reachable from a
a.c = b.c;
b.c = null;
// gc process marks b, nothing reachable from b
// marking phase completes, a.c is not marked
// gc sweeps a.c
print a.c; // safety violation
推荐阅读
- c++ - 使用单循环打印矩阵的 L 部分
- php - 如何在laravel中将关系的属性作为逗号分隔值?
- ios - Swift Realm - ATS 失败的系统信任
- reporting-services - ./node_modules/ngx-ssrs-reportviewer/fesm5/ngx-ssrs-reportviewer.js 中的错误
- c# - 我可以在 Q# 中使用 lambda 对量子位进行操作吗?
- java - 如何从 Room 数据库导出/导入到 Storage?
- google-sheets - 来自另一列的重复值
- jmeter - 不通过测试
- github - GitHub 包注册表中的公共和私有包
- css - 图像的 css 偏离中心边框