我已经阅读了大量有关Java SE 6和7的HotSpot GC的文档。在讨论获取空闲内存连续区域的策略时,提出了两种“竞争”方法:疏散方法(通常应用于年轻一代) ),将活动对象从“从”复制到空的“至”,然后进行压缩(CMS的后备),其中将活动对象移动到碎片区域内的一侧,以形成已使用未使用的连续块记忆。
两种方法都与“活动集”的大小成比例。不同之处在于,疏散需要的空间是实心集的2倍,而实心集不需要。
为什么我们完全需要疏散技术? 需要完成的复制数量是相同的,但是它需要保留更多的堆大小,并且不允许更快地重新映射引用。
正确:疏散可以并行执行(而压缩无法或至少不那么容易进行),但从未提及过此特性,而且似乎也不那么重要(考虑到重新映射比移动昂贵得多)。
最佳答案
一个大问题是,通过“疏散”,腾出的空间确实是空的,而通过“压缩”,其他一些对象Y可能会移动到对象X所在的空间。这使纠正指针变得更加困难,因为不能简单地使用指针指向无效位置这一事实来提示需要更新的代码。并且不能将“转发指针”存储在“无效”位置。
这使得GC的并发性大大降低-应用程序必须处于“GC冻结”状态的时间更长。