关注公众号:Java架构师联盟,每日更新技术好文
Young GC
前文提到,Young GC(以下简称YGC)是指新生代垃圾回收,下面将详细讨论G1的YGC过程。
选择CSet
YGC的回收过程位于 G1CollectedHeap::do_collection_pause_at_safepoint(),在进行垃圾回收前它会创建一个清理集CSet(Collection Set),存放需要被清理的Region。选择合适的Region放入CSet是为了让G1达到用户期望的合理的停顿时间。CSet的创建过程如代码清单11-2所示:
代码清单11-2 选择Region放入CSet
void G1Policy::finalize_collection_set(...) {
// 先选择新生代Region,用户期望的最大停顿时间是target_pause_time_ms
// G1计算出清理新生代Region的可能用时后,会将剩下的时间(time_remaining_ms)给老年代
double time_remaining_ms =
_collection_set->finalize_young_part(...);
_collection_set->finalize_old_part(time_remaining_ms);
}
G1的YGC只负责清理新生代Region,因此finalize_old_part()不会选择任何Region,所以只需要关注finalize_young_part()。finalize_young_part会在将所有Eden和Survivor Region加入CSet后准备垃圾回收。
G1在evacuate_collect_set()中创建G1ParTask,然后阻塞