221 assert(Thread::current()->is_VM_thread(), "Only by VM thread"); |
221 assert(Thread::current()->is_VM_thread(), "Only by VM thread"); |
222 // Must use _claim_none to avoid interfering with concurrent CLDG iteration |
222 // Must use _claim_none to avoid interfering with concurrent CLDG iteration |
223 CLDToOopClosure clds(oops, ClassLoaderData::_claim_none); |
223 CLDToOopClosure clds(oops, ClassLoaderData::_claim_none); |
224 MarkingCodeBlobClosure code(oops, !CodeBlobToOopClosure::FixRelocations); |
224 MarkingCodeBlobClosure code(oops, !CodeBlobToOopClosure::FixRelocations); |
225 ShenandoahParallelOopsDoThreadClosure tc_cl(oops, &code, NULL); |
225 ShenandoahParallelOopsDoThreadClosure tc_cl(oops, &code, NULL); |
|
226 AlwaysTrueClosure always_true; |
226 ResourceMark rm; |
227 ResourceMark rm; |
227 |
228 |
228 _serial_roots.oops_do(oops, 0); |
229 _serial_roots.oops_do(oops, 0); |
229 _vm_roots.oops_do(oops, 0); |
230 _vm_roots.oops_do(oops, 0); |
230 _cld_roots.cld_do(&clds, 0); |
231 _cld_roots.cld_do(&clds, 0); |
231 _thread_roots.threads_do(&tc_cl, 0); |
232 _thread_roots.threads_do(&tc_cl, 0); |
232 _code_roots.code_blobs_do(&code, 0); |
233 _code_roots.code_blobs_do(&code, 0); |
|
234 |
|
235 _serial_weak_roots.weak_oops_do(oops, 0); |
|
236 _weak_roots.oops_do<OopClosure>(oops, 0); |
|
237 _dedup_roots.oops_do(&always_true, oops, 0); |
233 } |
238 } |
234 |
239 |
235 void ShenandoahHeapIterationRootScanner::strong_roots_do(OopClosure* oops) { |
240 void ShenandoahHeapIterationRootScanner::strong_roots_do(OopClosure* oops) { |
236 assert(Thread::current()->is_VM_thread(), "Only by VM thread"); |
241 assert(Thread::current()->is_VM_thread(), "Only by VM thread"); |
237 // Must use _claim_none to avoid interfering with concurrent CLDG iteration |
242 // Must use _claim_none to avoid interfering with concurrent CLDG iteration |