< prev index next >

src/hotspot/share/gc/g1/g1CollectedHeap.cpp

Print this page
rev 49900 : imported patch 6672778-partial-queue-trimming
rev 49901 : imported patch 6672778-refactoring
rev 49902 : imported patch 6672778-stefanj-review
rev 49905 : imported patch 8201492-properly-implement-non-contiguous-reference-processing
rev 49906 : imported patch 8201640-use-ref-processor-members-directly
rev 49907 : imported patch 8202018-move-card-table-clear
rev 49908 : imported patch 8202021-cleanup-referenceprocessor
rev 49910 : imported patch 8202017-reference-processor-remove-enqueue

*** 3859,3869 **** _workers->run_task(&enq_task_proxy); } // End of weak reference support closures - // Weak Reference processing during an evacuation pause (part 1). void G1CollectedHeap::process_discovered_references(G1ParScanThreadStateSet* per_thread_states) { double ref_proc_start = os::elapsedTime(); ReferenceProcessor* rp = _ref_processor_stw; assert(rp->discovery_enabled(), "should have been enabled"); --- 3859,3868 ----
*** 3919,3979 **** _gc_tracer_stw->report_gc_reference_stats(stats); // We have completed copying any necessary live referent objects. assert(pss->queue_is_empty(), "both queue and overflow should be empty"); double ref_proc_time = os::elapsedTime() - ref_proc_start; g1_policy()->phase_times()->record_ref_proc_time(ref_proc_time * 1000.0); } ! // Weak Reference processing during an evacuation pause (part 2). ! void G1CollectedHeap::enqueue_discovered_references(G1ParScanThreadStateSet* per_thread_states) { ! double ref_enq_start = os::elapsedTime(); ! ! ReferenceProcessor* rp = _ref_processor_stw; ! assert(!rp->discovery_enabled(), "should have been disabled as part of processing"); ! ! ReferenceProcessorPhaseTimes* pt = g1_policy()->phase_times()->ref_phase_times(); ! ! // Now enqueue any remaining on the discovered lists on to ! // the pending list. ! if (!rp->processing_is_mt()) { ! // Serial reference processing... ! rp->enqueue_discovered_references(NULL, pt); ! } else { ! // Parallel reference enqueueing ! ! uint n_workers = workers()->active_workers(); ! ! assert(n_workers <= rp->max_num_queues(), ! "Mismatch between the number of GC workers %u and the maximum number of Reference process queues %u", ! n_workers, rp->max_num_queues()); ! ! G1STWRefProcTaskExecutor par_task_executor(this, per_thread_states, workers(), _task_queues, n_workers); ! rp->enqueue_discovered_references(&par_task_executor, pt); ! } ! ! rp->verify_no_references_recorded(); ! assert(!rp->discovery_enabled(), "should have been disabled"); ! ! // If during an initial mark pause we install a pending list head which is not otherwise reachable ! // ensure that it is marked in the bitmap for concurrent marking to discover. if (collector_state()->in_initial_mark_gc()) { oop pll_head = Universe::reference_pending_list(); if (pll_head != NULL) { // Any valid worker id is fine here as we are in the VM thread and single-threaded. _cm->mark_in_next_bitmap(0 /* worker_id */, pll_head); } } - - // FIXME - // CM's reference processing also cleans up the string and symbol tables. - // Should we do that here also? We could, but it is a serial operation - // and could significantly increase the pause time. - - double ref_enq_time = os::elapsedTime() - ref_enq_start; - g1_policy()->phase_times()->record_ref_enq_time(ref_enq_time * 1000.0); } void G1CollectedHeap::merge_per_thread_state_info(G1ParScanThreadStateSet* per_thread_states) { double merge_pss_time_start = os::elapsedTime(); per_thread_states->flush(); --- 3918,3943 ---- _gc_tracer_stw->report_gc_reference_stats(stats); // We have completed copying any necessary live referent objects. assert(pss->queue_is_empty(), "both queue and overflow should be empty"); + make_pending_list_reachable(); + + rp->verify_no_references_recorded(); + double ref_proc_time = os::elapsedTime() - ref_proc_start; g1_policy()->phase_times()->record_ref_proc_time(ref_proc_time * 1000.0); } ! void G1CollectedHeap::make_pending_list_reachable() { if (collector_state()->in_initial_mark_gc()) { oop pll_head = Universe::reference_pending_list(); if (pll_head != NULL) { // Any valid worker id is fine here as we are in the VM thread and single-threaded. _cm->mark_in_next_bitmap(0 /* worker_id */, pll_head); } } } void G1CollectedHeap::merge_per_thread_state_info(G1ParScanThreadStateSet* per_thread_states) { double merge_pss_time_start = os::elapsedTime(); per_thread_states->flush();
*** 4049,4059 **** // to do this _before_ we retire the GC alloc regions // as we may have to copy some 'reachable' referent // objects (and their reachable sub-graphs) that were // not copied during the pause. process_discovered_references(per_thread_states); ! enqueue_discovered_references(per_thread_states); G1STWIsAliveClosure is_alive(this); G1KeepAliveClosure keep_alive(this); { --- 4013,4027 ---- // to do this _before_ we retire the GC alloc regions // as we may have to copy some 'reachable' referent // objects (and their reachable sub-graphs) that were // not copied during the pause. process_discovered_references(per_thread_states); ! ! // FIXME ! // CM's reference processing also cleans up the string and symbol tables. ! // Should we do that here also? We could, but it is a serial operation ! // and could significantly increase the pause time. G1STWIsAliveClosure is_alive(this); G1KeepAliveClosure keep_alive(this); {
< prev index next >