--- old/src/hotspot/share/gc/cms/concurrentMarkSweepGeneration.cpp 2018-05-08 09:40:58.276126527 +0200 +++ new/src/hotspot/share/gc/cms/concurrentMarkSweepGeneration.cpp 2018-05-08 09:40:57.984117504 +0200 @@ -290,13 +290,13 @@ if (_ref_processor == NULL) { // Allocate and initialize a reference processor _ref_processor = - new SpanReferenceProcessor(_span, // span - (ParallelGCThreads > 1) && ParallelRefProcEnabled, // mt processing - ParallelGCThreads, // mt processing degree - _cmsGen->refs_discovery_is_mt(), // mt discovery - MAX2(ConcGCThreads, ParallelGCThreads), // mt discovery degree - _cmsGen->refs_discovery_is_atomic(), // discovery is not atomic - &_is_alive_closure); // closure for liveness info + new ReferenceProcessor(&_span_discoverer, // span + (ParallelGCThreads > 1) && ParallelRefProcEnabled, // mt processing + ParallelGCThreads, // mt processing degree + _cmsGen->refs_discovery_is_mt(), // mt discovery + MAX2(ConcGCThreads, ParallelGCThreads), // mt discovery degree + _cmsGen->refs_discovery_is_atomic(), // discovery is not atomic + &_is_alive_closure); // closure for liveness info // Initialize the _ref_processor field of CMSGen _cmsGen->set_ref_processor(_ref_processor); @@ -445,7 +445,10 @@ CardTableRS* ct, ConcurrentMarkSweepPolicy* cp): _cmsGen(cmsGen), + // Adjust span to cover old (cms) gen + _span(cmsGen->reserved()), _ct(ct), + _span_discoverer(_span), _ref_processor(NULL), // will be set later _conc_workers(NULL), // may be set later _abort_preclean(false), @@ -455,8 +458,6 @@ _modUnionTable((CardTable::card_shift - LogHeapWordSize), -1 /* lock-free */, "No_lock" /* dummy */), _modUnionClosurePar(&_modUnionTable), - // Adjust my span to cover old (cms) gen - _span(cmsGen->reserved()), // Construct the is_alive_closure with _span & markBitMap _is_alive_closure(_span, &_markBitMap), _restart_addr(NULL), @@ -3752,7 +3753,7 @@ // Precleaning is currently not MT but the reference processor // may be set for MT. Disable it temporarily here. - SpanReferenceProcessor* rp = ref_processor(); + ReferenceProcessor* rp = ref_processor(); ReferenceProcessorMTDiscoveryMutator rp_mut_discovery(rp, false); // Do one pass of scrubbing the discovered reference lists @@ -3760,7 +3761,7 @@ // referents. if (clean_refs) { CMSPrecleanRefsYieldClosure yield_cl(this); - assert(rp->span().equals(_span), "Spans should be equal"); + assert(_span_discoverer.span().equals(_span), "Spans should be equal"); CMSKeepAliveClosure keep_alive(this, _span, &_markBitMap, &_markStack, true /* preclean */); CMSDrainMarkingStackClosure complete_trace(this, @@ -5152,7 +5153,7 @@ WorkGang* workers = heap->workers(); assert(workers != NULL, "Need parallel worker threads."); CMSRefProcTaskProxy rp_task(task, &_collector, - _collector.ref_processor()->span(), + _collector.ref_processor_span(), _collector.markBitMap(), workers, _collector.task_queues()); workers->run_task(&rp_task); @@ -5172,8 +5173,8 @@ ResourceMark rm; HandleMark hm; - SpanReferenceProcessor* rp = ref_processor(); - assert(rp->span().equals(_span), "Spans should be equal"); + ReferenceProcessor* rp = ref_processor(); + assert(_span_discoverer.span().equals(_span), "Spans should be equal"); assert(!rp->enqueuing_is_done(), "Enqueuing should not be complete"); // Process weak references. rp->setup_policy(false);