diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp b/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp index f6f46f047a5..86fe4fb3e93 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp @@ -242,6 +242,7 @@ void ShenandoahGeneration::scan_remembered_set() { uint nworkers = heap->workers()->active_workers(); reserve_task_queues(nworkers); + ShenandoahGCPhase phase(ShenandoahPhaseTimings::init_scan_rset); ShenandoahReferenceProcessor* rp = heap->ref_processor(); ShenandoahRegionIterator regions; ShenandoahScanRememberedTask task(task_queues(), old_gen_task_queues(), rp, ®ions); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahPhaseTimings.cpp b/src/hotspot/share/gc/shenandoah/shenandoahPhaseTimings.cpp index 6618559d661..dc81575057d 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahPhaseTimings.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahPhaseTimings.cpp @@ -97,6 +97,7 @@ bool ShenandoahPhaseTimings::is_worker_phase(Phase phase) { assert(phase >= 0 && phase < _num_phases, "Out of bounds"); switch (phase) { case init_evac: + case init_scan_rset: case finish_mark: case purge_weak_par: case full_gc_mark: diff --git a/src/hotspot/share/gc/shenandoah/shenandoahPhaseTimings.hpp b/src/hotspot/share/gc/shenandoah/shenandoahPhaseTimings.hpp index b490de9d050..1901c7cbdad 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahPhaseTimings.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahPhaseTimings.hpp @@ -46,6 +46,7 @@ class outputStream; f(CNT_PREFIX ## StringDedupQueueRoots, DESC_PREFIX "Dedup Queue Roots") \ f(CNT_PREFIX ## WeakRefProc, DESC_PREFIX "Weak References") \ f(CNT_PREFIX ## ParallelMark, DESC_PREFIX "Parallel Mark") \ + f(CNT_PREFIX ## ScanClusters, DESC_PREFIX "Scan Clusters") // end #define SHENANDOAH_PHASE_DO(f) \ @@ -54,6 +55,8 @@ class outputStream; f(init_mark_gross, "Pause Init Mark (G)") \ f(init_mark, "Pause Init Mark (N)") \ f(init_manage_tlabs, " Manage TLABs") \ + f(init_scan_rset, " Scan Remembered Set") \ + SHENANDOAH_PAR_PHASE_DO(init_scan_rset_, " RS: ", f) \ f(init_update_region_states, " Update Region States") \ \ f(conc_mark_roots, "Concurrent Mark Roots ") \ diff --git a/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.cpp b/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.cpp index e21b1370b38..b2bfa191619 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.cpp @@ -31,7 +31,7 @@ #include "gc/shenandoah/shenandoahReferenceProcessor.hpp" #include "gc/shenandoah/shenandoahScanRemembered.inline.hpp" -ShenandoahDirectCardMarkRememberedSet::ShenandoahDirectCardMarkRememberedSet(CardTable *card_table, size_t total_card_count) { +ShenandoahDirectCardMarkRememberedSet::ShenandoahDirectCardMarkRememberedSet(CardTable* card_table, size_t total_card_count) { _heap = ShenandoahHeap::heap(); _card_table = card_table; _total_card_count = total_card_count; @@ -64,8 +64,8 @@ void ShenandoahDirectCardMarkRememberedSet::initialize_overreach(size_t first_cl // unrolling the loop and doing wide writes if the compiler // doesn't do this for us. size_t first_card_index = first_cluster * ShenandoahCardCluster<ShenandoahDirectCardMarkRememberedSet>::CardsPerCluster; - uint8_t *omp = &_overreach_map[first_card_index]; - uint8_t *endp = omp + count * ShenandoahCardCluster<ShenandoahDirectCardMarkRememberedSet>::CardsPerCluster; + uint8_t* omp = &_overreach_map[first_card_index]; + uint8_t* endp = omp + count * ShenandoahCardCluster<ShenandoahDirectCardMarkRememberedSet>::CardsPerCluster; while (omp < endp) *omp++ = CardTable::clean_card_val(); } @@ -75,9 +75,9 @@ void ShenandoahDirectCardMarkRememberedSet::merge_overreach(size_t first_cluster // We can make this run faster in the future by explicitly unrolling the loop and doing wide writes if the compiler // doesn't do this for us. size_t first_card_index = first_cluster * ShenandoahCardCluster<ShenandoahDirectCardMarkRememberedSet>::CardsPerCluster; - uint8_t *bmp = &_byte_map[first_card_index]; - uint8_t *endp = bmp + count * ShenandoahCardCluster<ShenandoahDirectCardMarkRememberedSet>::CardsPerCluster; - uint8_t *omp = &_overreach_map[first_card_index]; + uint8_t* bmp = &_byte_map[first_card_index]; + uint8_t* endp = bmp + count * ShenandoahCardCluster<ShenandoahDirectCardMarkRememberedSet>::CardsPerCluster; + uint8_t* omp = &_overreach_map[first_card_index]; // dirty_card is 0, clean card is 0xff; if either *bmp or *omp is dirty, we need to mark it as dirty while (bmp < endp) @@ -95,11 +95,12 @@ void ShenandoahScanRememberedTask::work(uint worker_id) { // This sets up a thread local reference to the worker_id which is necessary // the weak reference processor. ShenandoahParallelWorkerSession worker_session(worker_id); + ShenandoahWorkerTimingsTracker x(ShenandoahPhaseTimings::init_scan_rset, ShenandoahPhaseTimings::ScanClusters, worker_id); ShenandoahObjToScanQueue* q = _queue_set->queue(worker_id); ShenandoahObjToScanQueue* old = _old_queue_set == NULL ? NULL : _old_queue_set->queue(worker_id); ShenandoahMarkRefsClosure<YOUNG> cl(q, _rp, old); - RememberedScanner *rs = ShenandoahHeap::heap()->card_scan(); + RememberedScanner* scanner = ShenandoahHeap::heap()->card_scan(); // set up thread local closure for shen ref processor _rp->set_mark_closure(worker_id, &cl); @@ -107,7 +108,7 @@ void ShenandoahScanRememberedTask::work(uint worker_id) { ShenandoahHeapRegion* region = _regions->next(); while (region != NULL) { if (region->affiliation() == OLD_GENERATION) { - rs->process_region(region, &cl); + scanner->process_region(region, &cl); } region = _regions->next(); }