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