据我所知,G1 GC执行疏散操作以从年轻区域和老年区域回收堆,从而间接压缩堆(将活动对象从待收集区域复制到空白区域)。那么,G1 GC是否会出现这样一种情况:没有完全空的区域可用于复制对象,但半满区域中有足够的分散堆?我想问一下,G1是否跟踪区域内的空闲空间,并在区域内进行压缩?
HotSpot VM垃圾回收调优指南在分配(疏散)失败部分中提到:
如果在垃圾回收区域的疏散过程中找不到空闲(空)区域,则会发生分配失败(因为没有空间来分配从正在疏散的区域中存活的对象),并且会进行停止-全局(STW)回收。
虽然没有明确说明,但这意味着STW全局回收能够执行压缩,否则它就不是解决碎片问题的方法。我只在巨大对象和巨大分配部分找到了关于压缩能力的间接提示:
为了减少复制开销,巨型对象不包含在任何疏散暂停中。完整的垃圾回收周期会原地压缩巨型对象。
G1ReservePercent
的存在来暗示... - Eugene