< prev index next >

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

Print this page

181 ShenandoahRootUpdater::ShenandoahRootUpdater(uint n_workers, ShenandoahPhaseTimings::Phase phase) :
182   ShenandoahRootProcessor(phase),
183   _vm_roots(phase),
184   _cld_roots(phase, n_workers, false /*heap iteration*/),
185   _thread_roots(phase, n_workers > 1),
186   _weak_roots(phase),
187   _code_roots(phase) {
188 }
189 
190 ShenandoahRootAdjuster::ShenandoahRootAdjuster(uint n_workers, ShenandoahPhaseTimings::Phase phase) :
191   ShenandoahRootProcessor(phase),
192   _vm_roots(phase),
193   _cld_roots(phase, n_workers, false /*heap iteration*/),
194   _thread_roots(phase, n_workers > 1),
195   _weak_roots(phase),
196   _code_roots(phase) {
197   assert(ShenandoahHeap::heap()->is_full_gc_in_progress(), "Full GC only");
198 }
199 
200 void ShenandoahRootAdjuster::roots_do(uint worker_id, OopClosure* oops) {
201   NMethodToOopClosure code_blob_cl(oops, NMethodToOopClosure::FixRelocations);
202   ShenandoahNMethodAndDisarmClosure nmethods_and_disarm_Cl(oops);
203   NMethodToOopClosure* adjust_code_closure = ShenandoahCodeRoots::use_nmethod_barriers_for_mark() ?
204                                              static_cast<NMethodToOopClosure*>(&nmethods_and_disarm_Cl) :
205                                              static_cast<NMethodToOopClosure*>(&code_blob_cl);
206   CLDToOopClosure adjust_cld_closure(oops, ClassLoaderData::_claim_strong);
207 
208   // Process light-weight/limited parallel roots then
209   _vm_roots.oops_do(oops, worker_id);
210   _weak_roots.oops_do<OopClosure>(oops, worker_id);
211   _cld_roots.cld_do(&adjust_cld_closure, worker_id);
212 
213   // Process heavy-weight/fully parallel roots the last
214   _code_roots.nmethods_do(adjust_code_closure, worker_id);
215   _thread_roots.oops_do(oops, nullptr, worker_id);
216 }
217 
218 ShenandoahHeapIterationRootScanner::ShenandoahHeapIterationRootScanner(uint n_workers) :
219   ShenandoahRootProcessor(ShenandoahPhaseTimings::heap_iteration_roots),
220   _thread_roots(ShenandoahPhaseTimings::heap_iteration_roots, false /*is par*/),
221   _vm_roots(ShenandoahPhaseTimings::heap_iteration_roots),
222   _cld_roots(ShenandoahPhaseTimings::heap_iteration_roots, n_workers, true /*heap iteration*/),
223   _weak_roots(ShenandoahPhaseTimings::heap_iteration_roots),
224   _code_roots(ShenandoahPhaseTimings::heap_iteration_roots) {
225 }
226 
227 class ShenandoahMarkNMethodClosure : public NMethodClosure {
228 private:
229   OopClosure* const _oops;
230   BarrierSetNMethod* const _bs_nm;
231 
232 public:
233   ShenandoahMarkNMethodClosure(OopClosure* oops) :
234     _oops(oops),

181 ShenandoahRootUpdater::ShenandoahRootUpdater(uint n_workers, ShenandoahPhaseTimings::Phase phase) :
182   ShenandoahRootProcessor(phase),
183   _vm_roots(phase),
184   _cld_roots(phase, n_workers, false /*heap iteration*/),
185   _thread_roots(phase, n_workers > 1),
186   _weak_roots(phase),
187   _code_roots(phase) {
188 }
189 
190 ShenandoahRootAdjuster::ShenandoahRootAdjuster(uint n_workers, ShenandoahPhaseTimings::Phase phase) :
191   ShenandoahRootProcessor(phase),
192   _vm_roots(phase),
193   _cld_roots(phase, n_workers, false /*heap iteration*/),
194   _thread_roots(phase, n_workers > 1),
195   _weak_roots(phase),
196   _code_roots(phase) {
197   assert(ShenandoahHeap::heap()->is_full_gc_in_progress(), "Full GC only");
198 }
199 
200 void ShenandoahRootAdjuster::roots_do(uint worker_id, OopClosure* oops) {

201   ShenandoahNMethodAndDisarmClosure nmethods_and_disarm_Cl(oops);



202   CLDToOopClosure adjust_cld_closure(oops, ClassLoaderData::_claim_strong);
203 
204   // Process light-weight/limited parallel roots then
205   _vm_roots.oops_do(oops, worker_id);
206   _weak_roots.oops_do<OopClosure>(oops, worker_id);
207   _cld_roots.cld_do(&adjust_cld_closure, worker_id);
208 
209   // Process heavy-weight/fully parallel roots the last
210   _code_roots.nmethods_do(&nmethods_and_disarm_Cl, worker_id);
211   _thread_roots.oops_do(oops, nullptr, worker_id);
212 }
213 
214 ShenandoahHeapIterationRootScanner::ShenandoahHeapIterationRootScanner(uint n_workers) :
215   ShenandoahRootProcessor(ShenandoahPhaseTimings::heap_iteration_roots),
216   _thread_roots(ShenandoahPhaseTimings::heap_iteration_roots, false /*is par*/),
217   _vm_roots(ShenandoahPhaseTimings::heap_iteration_roots),
218   _cld_roots(ShenandoahPhaseTimings::heap_iteration_roots, n_workers, true /*heap iteration*/),
219   _weak_roots(ShenandoahPhaseTimings::heap_iteration_roots),
220   _code_roots(ShenandoahPhaseTimings::heap_iteration_roots) {
221 }
222 
223 class ShenandoahMarkNMethodClosure : public NMethodClosure {
224 private:
225   OopClosure* const _oops;
226   BarrierSetNMethod* const _bs_nm;
227 
228 public:
229   ShenandoahMarkNMethodClosure(OopClosure* oops) :
230     _oops(oops),
< prev index next >