首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >垃圾收集中的疏散和压实有什么根本区别?

垃圾收集中的疏散和压实有什么根本区别?
EN

Stack Overflow用户
提问于 2013-12-29 20:37:00
回答 2查看 690关注 0票数 8

我已经阅读了大量关于Java 6和7的HotSpot GC的文档。在谈到获取空闲内存的相邻区域的策略时,提出了两种“相互竞争”的方法:疏散(通常应用于年轻一代),其中活的对象从“从”复制到“空”到“压缩”,其中活的对象被移动到一个支离破碎的区域的一侧,形成一个连续的未使用内存块。

这两种方法都与“直播集”的大小成正比。不同之处在于,疏散需要的是x2时间空间,而不是活动设置,而这里的压实不需要。

为什么我们需要疏散技术?需要复制的数量是相同的,但是它需要保留更多的堆大小,并且不允许更快地重新映射引用。

没错:疏散可以并行进行(因为压缩不能,或者至少不那么容易),但这个特性从未被提及,而且似乎也没有那么重要(考虑到重新映射比移动要昂贵得多)。

EN

回答 2

Stack Overflow用户

发布于 2013-12-29 20:45:42

一个大问题是,由于“疏散”,空出的空间确实是空的,而使用“压实”的其他物体Y可能被移动到物体X所在的空间中。这使得修改指针变得更加困难,因为不能简单地使用指针指向无效位置这一事实来提示需要更新的代码。并且不能将“转发指针”存储在“无效”位置。

这使得GC的并发性大大降低--应用程序必须在更长的时间内处于"GC冻结“状态。

票数 5
EN

Stack Overflow用户

发布于 2018-10-07 13:33:01

压缩更适合于预期可回收对象的数量较低的情况(例如,终身生成),因为经过几个GC循环后,长活对象往往占据堆的较低部分,因此收集器所需的工作量较少。在这种情况下,如果使用复制收集器,其性能将非常差,因为来自前一个周期的几乎相同的幸存对象需要一次又一次地从一个位置复制到另一个位置。

当可回收对象的数量很高(例如年轻一代)时,复制是合适的,因为需要复制的存活对象非常少。如果在这种情况下使用压缩,则可能执行得很差,因为幸存的对象可能分散在堆中。

除此之外,正如@HotLicks应答复制收集器中提到的那样,复制收集器允许我们存储一个转发指针,以防止进入无限循环,以防来自同一空间的另一个对象引用一个已经移动的对象。

此外,在识别所有活动对象之前,无法启动Compaction,但一旦识别出活动对象(使用多个线程),就可以将活动对象复制到新位置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20829813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档