It looks as if G1 does not always initiate partially-young GCs after a concurrent marking cycle. The flag that initiates partially-young GCs is _last_full_young_gc (it means: the next GC will be the last young GC and we'll do partially-young ones after that) and it's set in record_concurrent_mark_cleanup_completed(). This is called at the end of concurrent cleanup: // Check if cleanup set the free_regions_coming flag. If it // hasn't, we can just skip the next step. if (g1h->free_regions_coming()) { ... _sts.join(); g1_policy->record_concurrent_mark_cleanup_completed(); _sts.leave(); } Note, however, that unfortunately it's only called if free_regions_coming() is true, which is only true if cleanup found totally empty regions to reclaim. Many thanks to Thomas Schatzl for bringing this up.
|