--- old/src/hotspot/share/gc/g1/g1CollectedHeap.cpp 2018-11-27 18:26:11.508007390 +0100 +++ new/src/hotspot/share/gc/g1/g1CollectedHeap.cpp 2018-11-27 18:26:11.076005248 +0100 @@ -3738,6 +3738,7 @@ size_t scanned = 0; size_t claimed = 0; size_t skipped = 0; + size_t used_memory = 0; Ticks start = Ticks::now(); Tickspan copy_time; @@ -3754,6 +3755,9 @@ scanned += scan_rs_cl.cards_scanned(); claimed += scan_rs_cl.cards_claimed(); skipped += scan_rs_cl.cards_skipped(); + + // Chunk lists for this region is no longer needed. + used_memory += pss->oops_into_optional_region(hr)->free_chunk_lists(); } Tickspan scan_time = (Ticks::now() - start) - copy_time; @@ -3761,9 +3765,10 @@ p->record_or_add_time_secs(G1GCPhaseTimes::OptScanRS, worker_id, scan_time.seconds()); p->record_or_add_time_secs(G1GCPhaseTimes::OptObjCopy, worker_id, copy_time.seconds()); - p->record_thread_work_item(G1GCPhaseTimes::OptScanRS, worker_id, scanned, G1GCPhaseTimes::OptCSetScannedCards); - p->record_thread_work_item(G1GCPhaseTimes::OptScanRS, worker_id, claimed, G1GCPhaseTimes::OptCSetClaimedCards); - p->record_thread_work_item(G1GCPhaseTimes::OptScanRS, worker_id, skipped, G1GCPhaseTimes::OptCSetSkippedCards); + p->record_or_add_thread_work_item(G1GCPhaseTimes::OptScanRS, worker_id, scanned, G1GCPhaseTimes::OptCSetScannedCards); + p->record_or_add_thread_work_item(G1GCPhaseTimes::OptScanRS, worker_id, claimed, G1GCPhaseTimes::OptCSetClaimedCards); + p->record_or_add_thread_work_item(G1GCPhaseTimes::OptScanRS, worker_id, skipped, G1GCPhaseTimes::OptCSetSkippedCards); + p->record_or_add_thread_work_item(G1GCPhaseTimes::OptScanRS, worker_id, used_memory, G1GCPhaseTimes::OptCSetUsedMemory); } void evacuate_live_objects(G1ParScanThreadState* pss, uint worker_id) { @@ -3812,7 +3817,7 @@ } void G1CollectedHeap::evacuate_optional_collection_set(G1ParScanThreadStateSet* per_thread_states) { - G1OptionalCSet optional_cset(&_collection_set); + G1OptionalCSet optional_cset(&_collection_set, per_thread_states); if (optional_cset.is_empty()) { return; }