java - 在 mark-sweep-compact 的紧凑阶段之后,空闲的内存块是否会进入 Eden?
问题描述
据我了解,堆中有一个用于年轻对象的实心空间和一个用于旧对象的实心空间。对象在收集期间在两个区域中移动,但在第二个区域中,它们也被压缩。我的问题是为什么它们被压实,释放的固体区域是用来做什么的,伊甸园还是新的大旧物体?
解决方案
让我们看一下 HotSpot 堆(其他实现可能不同)。
年轻代分为三个区域,伊甸园空间和两个幸存者空间。大多数对象最初是使用简单(非常快速)的指针碰撞方法在 Eden 空间中分配的。为避免线程争用,每个应用程序线程都有自己的线程本地分配块 (TLAB)。当 GC 在这里发生时,活动对象被复制到幸存者空间之一。在被复制到老年代之前,活对象在幸存者空间之间被复制多次(由tenuring threshold确定)。这就是在次要 GC 期间移动对象的方式。
不同的算法以不同的方式处理老年代的 GC(主要 GC)。例如,CMS 识别活动对象之间的间隙并将它们添加到列表中,以便为正在提升的对象分配空间。在某些时候,碎片变得太大,并且会发生完整的压缩收集。在此期间,所有对象都被重新定位为在堆底部是连续的,因此没有间隙。
为了回答你的问题,老一代被压缩以消除碎片。然后,压缩数据上方的内存区域将用于在次要 GC 期间提升的对象。年轻一代和老一代保持分离。
推荐阅读
- asp.net - ASP.NET 和 Firefox:gridview SelectedIndexChanged 使用 HTTPS 触发两次
- node.js - 如何正确实现节点js中500错误的错误处理
- python - Django - 无法让模型在模板中显示
- c++ - 使用单个模板函数调用具有不同参数计数的类似函数
- symfony - 如何获取在 symfony 3 中选择了哪个单选按钮?
- android - 虽然循环在线程中运行,但它阻塞了主 gui
- c# - 在 unity3d 国际象棋游戏中,我无法在第 7 个位置选择或移动棋子和车
- wso2 - 使用 WSO2 AM 的联合用户
- angular - 如何从我的 Angular 5 应用程序向用户的 Gmail 帐户发送通知?
- javascript - 将数据从输入字段移动到另一个并提交表单