java - 为什么我们需要在标记清扫垃圾收集期间进行“清扫”?
问题描述
假设我们正在使用标记清除垃圾收集算法,如果我们能够将内存分配标记为“可回收”,这还不够吗?难道程序不知道“可回收”内存基本上是可以在请求时分配的未使用内存吗?如图所示,“可回收”块与“未使用”块之间的物理差异是什么:
解决方案
标记- 在标记阶段,所有可从 Java 线程、本机句柄和其他根源访问的对象都被标记为活动的,以及可从这些对象访问的对象等等。此过程识别并标记所有仍在使用的对象,其余的可以视为垃圾。
清扫- 在清扫阶段,遍历堆以查找活动对象之间的间隙。这些间隙记录在空闲列表中,可用于新的对象分配。
未使用与可回收空间 - 未使用空间只不过是活动块之间的间隙,这些间隙是由于未使用/可回收对象的垃圾收集而创建的,压缩阶段会将未使用的块移动到最后。比较发布的图像中的两个图表。
推荐阅读
- java - 插件不能为空错误 - Spigot Coding
- python-3.x - 检查项目时如何阻止包含检查按钮的tkinter OptionMenu关闭
- python - 有人可以解释为什么这个导入不会引发错误吗?
- react-bootstrap - react-bootstrap 轮播在移动设备上隐藏控件
- debugging - cmake中的cmdline选项--trace和--debug-output有什么区别?
- r - 如何在虹膜测试数据上应用 Kohonen 可视化?
- javascript - JavaScript:如何从内部函数调用 Bootstrap 模态?
- android - Android 布局未按预期运行
- html - css 垂直按钮组 - 忽略 justify-content
- ruby - Aws::S3::Errors::InvalidArgument (): on bucket.put_object