当Eden空间年轻一代充满时,将触发次要GC。在次要GC过程中,Eden中的非自由对象和一个源Survivor空间将被复制到另一个目标Survivor空间。
我的问题是,如果目的地幸存者空间已满,小型GC怎么办?
答案 0 :(得分:1)
年轻一代有3个片段Eden Space,Survivor1和Survivor2。这些只是Young Generation的逻辑分歧。所以对象从Eden Space复制到Survivor1然后再复制到Survivor2。
一般来说,小集合意味着集合发生在Young一代。如果Young generation已满,则对象将被复制到Old generation。
同样,收集是次要的或主要取决于多种因素,其中之一是年轻一代的空间可用性。因此,如果Young代中有足够的空间用于对象分配,那么它将是次要的集合。但是如果YG中没有足够的可用空间,那么相同的集合可以变成主要的。
JVM规范也没有谈论垃圾收集。所以它留给JVM实现者有自己的策略。
答案 1 :(得分:1)
如果无法完成/完成次要集合,则执行主要/完整集合。这通常使用标记扫描紧凑算法而不是复制算法来完成...这是完全收集昂贵的一个原因。
但最终(如果你继续填充堆),完整的集合将无法回收足够的空间来继续,并且将抛出OOME。 (或者如果您使用-XX:+UseGCOverheadLimit
,当在GC中花费的百分比时间超过指定阈值时,将抛出OOME。)