< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp

Print this page
rev 55429 : 8226413: Shenandoah: Separate root scanner for SH::object_iterate()


 105 }
 106 
 107 ShenandoahStringDedupRoots::ShenandoahStringDedupRoots() {
 108   if (ShenandoahStringDedup::is_enabled()) {
 109     StringDedup::gc_prologue(false);
 110   }
 111 }
 112 
 113 ShenandoahStringDedupRoots::~ShenandoahStringDedupRoots() {
 114   if (ShenandoahStringDedup::is_enabled()) {
 115     StringDedup::gc_epilogue();
 116   }
 117 }
 118 
 119 void ShenandoahStringDedupRoots::oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, uint worker_id) {
 120   if (ShenandoahStringDedup::is_enabled()) {
 121     ShenandoahStringDedup::parallel_oops_do(is_alive, keep_alive, worker_id);
 122   }
 123 }
 124 
 125 ShenandoahClassLoaderDataRoots::ShenandoahClassLoaderDataRoots() {
 126   ClassLoaderDataGraph::clear_claimed_marks();
 127 }
 128 
 129 void ShenandoahClassLoaderDataRoots::clds_do(CLDClosure* strong_clds, CLDClosure* weak_clds, uint worker_id) {
 130   ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times();
 131   ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::CLDGRoots, worker_id);
 132   ClassLoaderDataGraph::roots_cld_do(strong_clds, weak_clds);
 133 }
 134 
 135 ShenandoahRootProcessor::ShenandoahRootProcessor(ShenandoahPhaseTimings::Phase phase) :
 136   _heap(ShenandoahHeap::heap()),
 137   _phase(phase) {
 138   assert(SafepointSynchronize::is_at_safepoint(), "Must at safepoint");
 139   _heap->phase_timings()->record_workers_start(_phase);
 140 }
 141 
 142 ShenandoahRootProcessor::~ShenandoahRootProcessor() {
 143   assert(SafepointSynchronize::is_at_safepoint(), "Must at safepoint");
 144   _heap->phase_timings()->record_workers_end(_phase);
 145 }
 146 
 147 ShenandoahRootEvacuator::ShenandoahRootEvacuator(uint n_workers, ShenandoahPhaseTimings::Phase phase, bool include_concurrent_roots) :
 148   ShenandoahRootProcessor(phase),
 149   _thread_roots(n_workers > 1),
 150   _weak_roots(n_workers),
 151   _include_concurrent_roots(include_concurrent_roots) {
 152 }
 153 
 154 void ShenandoahRootEvacuator::roots_do(uint worker_id, OopClosure* oops) {


 181   _thread_roots(n_workers > 1),
 182   _weak_roots(n_workers) {
 183   assert(ShenandoahHeap::heap()->is_full_gc_in_progress(), "Full GC only");
 184 }
 185 
 186 void ShenandoahRootAdjuster::roots_do(uint worker_id, OopClosure* oops) {
 187   CodeBlobToOopClosure adjust_code_closure(oops, CodeBlobToOopClosure::FixRelocations);
 188   CLDToOopClosure adjust_cld_closure(oops, ClassLoaderData::_claim_strong);
 189   AlwaysTrueClosure always_true;
 190 
 191   _serial_roots.oops_do(oops, worker_id);
 192   _jni_roots.oops_do(oops, worker_id);
 193 
 194   _thread_roots.oops_do(oops, NULL, worker_id);
 195   _cld_roots.clds_do(&adjust_cld_closure, NULL, worker_id);
 196   _code_roots.code_blobs_do(&adjust_code_closure, worker_id);
 197 
 198   _weak_roots.oops_do<AlwaysTrueClosure, OopClosure>(&always_true, oops, worker_id);
 199   _dedup_roots.oops_do(&always_true, oops, worker_id);
 200 }




































 105 }
 106 
 107 ShenandoahStringDedupRoots::ShenandoahStringDedupRoots() {
 108   if (ShenandoahStringDedup::is_enabled()) {
 109     StringDedup::gc_prologue(false);
 110   }
 111 }
 112 
 113 ShenandoahStringDedupRoots::~ShenandoahStringDedupRoots() {
 114   if (ShenandoahStringDedup::is_enabled()) {
 115     StringDedup::gc_epilogue();
 116   }
 117 }
 118 
 119 void ShenandoahStringDedupRoots::oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, uint worker_id) {
 120   if (ShenandoahStringDedup::is_enabled()) {
 121     ShenandoahStringDedup::parallel_oops_do(is_alive, keep_alive, worker_id);
 122   }
 123 }
 124 










 125 ShenandoahRootProcessor::ShenandoahRootProcessor(ShenandoahPhaseTimings::Phase phase) :
 126   _heap(ShenandoahHeap::heap()),
 127   _phase(phase) {
 128   assert(SafepointSynchronize::is_at_safepoint(), "Must at safepoint");
 129   _heap->phase_timings()->record_workers_start(_phase);
 130 }
 131 
 132 ShenandoahRootProcessor::~ShenandoahRootProcessor() {
 133   assert(SafepointSynchronize::is_at_safepoint(), "Must at safepoint");
 134   _heap->phase_timings()->record_workers_end(_phase);
 135 }
 136 
 137 ShenandoahRootEvacuator::ShenandoahRootEvacuator(uint n_workers, ShenandoahPhaseTimings::Phase phase, bool include_concurrent_roots) :
 138   ShenandoahRootProcessor(phase),
 139   _thread_roots(n_workers > 1),
 140   _weak_roots(n_workers),
 141   _include_concurrent_roots(include_concurrent_roots) {
 142 }
 143 
 144 void ShenandoahRootEvacuator::roots_do(uint worker_id, OopClosure* oops) {


 171   _thread_roots(n_workers > 1),
 172   _weak_roots(n_workers) {
 173   assert(ShenandoahHeap::heap()->is_full_gc_in_progress(), "Full GC only");
 174 }
 175 
 176 void ShenandoahRootAdjuster::roots_do(uint worker_id, OopClosure* oops) {
 177   CodeBlobToOopClosure adjust_code_closure(oops, CodeBlobToOopClosure::FixRelocations);
 178   CLDToOopClosure adjust_cld_closure(oops, ClassLoaderData::_claim_strong);
 179   AlwaysTrueClosure always_true;
 180 
 181   _serial_roots.oops_do(oops, worker_id);
 182   _jni_roots.oops_do(oops, worker_id);
 183 
 184   _thread_roots.oops_do(oops, NULL, worker_id);
 185   _cld_roots.clds_do(&adjust_cld_closure, NULL, worker_id);
 186   _code_roots.code_blobs_do(&adjust_code_closure, worker_id);
 187 
 188   _weak_roots.oops_do<AlwaysTrueClosure, OopClosure>(&always_true, oops, worker_id);
 189   _dedup_roots.oops_do(&always_true, oops, worker_id);
 190 }
 191 
 192  ShenandoahHeapIterationRootScanner::ShenandoahHeapIterationRootScanner() :
 193    ShenandoahRootProcessor(ShenandoahPhaseTimings::_num_phases),
 194    _thread_roots(false /*is par*/) {
 195  }
 196 
 197  void ShenandoahHeapIterationRootScanner::roots_do(OopClosure* oops) {
 198    assert(Thread::current()->is_VM_thread(), "Only by VM thread");
 199    // Must use _claim_none to avoid interfering with concurrent CLDG iteration
 200    CLDToOopClosure clds(oops, ClassLoaderData::_claim_none);
 201    MarkingCodeBlobClosure code(oops, !CodeBlobToOopClosure::FixRelocations);
 202    ShenandoahParallelOopsDoThreadClosure tc_cl(oops, &code, NULL);
 203    ResourceMark rm;
 204 
 205    _serial_roots.oops_do(oops, 0);
 206    _jni_roots.oops_do(oops, 0);
 207    _cld_roots.clds_do(&clds, &clds, 0);
 208    _thread_roots.threads_do(&tc_cl, 0);
 209    _code_roots.code_blobs_do(&code, 0);
 210  }
 211 
 212  void ShenandoahHeapIterationRootScanner::strong_roots_do(OopClosure* oops) {
 213    assert(Thread::current()->is_VM_thread(), "Only by VM thread");
 214    // Must use _claim_none to avoid interfering with concurrent CLDG iteration
 215    CLDToOopClosure clds(oops, ClassLoaderData::_claim_none);
 216    MarkingCodeBlobClosure code(oops, !CodeBlobToOopClosure::FixRelocations);
 217    ShenandoahParallelOopsDoThreadClosure tc_cl(oops, &code, NULL);
 218    ResourceMark rm;
 219 
 220    _serial_roots.oops_do(oops, 0);
 221    _jni_roots.oops_do(oops, 0);
 222    _cld_roots.clds_do(&clds, NULL, 0);
 223    _thread_roots.threads_do(&tc_cl, 0);
 224  }
< prev index next >