73 } |
73 } |
74 |
74 |
75 ShenandoahHeap::heap()->phase_timings()->record_workers_end(_phase); |
75 ShenandoahHeap::heap()->phase_timings()->record_workers_end(_phase); |
76 } |
76 } |
77 |
77 |
78 void ShenandoahRootProcessor::process_all_roots_slow(OopClosure* oops) { |
|
79 CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong); |
|
80 CodeBlobToOopClosure blobs(oops, !CodeBlobToOopClosure::FixRelocations); |
|
81 |
|
82 CodeCache::blobs_do(&blobs); |
|
83 ClassLoaderDataGraph::cld_do(&clds); |
|
84 Universe::oops_do(oops); |
|
85 Management::oops_do(oops); |
|
86 JvmtiExport::oops_do(oops); |
|
87 JNIHandles::oops_do(oops); |
|
88 ObjectSynchronizer::oops_do(oops); |
|
89 SystemDictionary::oops_do(oops); |
|
90 |
|
91 AlwaysTrueClosure always_true; |
|
92 WeakProcessor::weak_oops_do(&always_true, oops); |
|
93 |
|
94 if (ShenandoahStringDedup::is_enabled()) { |
|
95 ShenandoahStringDedup::oops_do_slow(oops); |
|
96 } |
|
97 |
|
98 // Do thread roots the last. This allows verification code to find |
|
99 // any broken objects from those special roots first, not the accidental |
|
100 // dangling reference from the thread root. |
|
101 Threads::possibly_parallel_oops_do(false, oops, &blobs); |
|
102 } |
|
103 |
|
104 void ShenandoahRootProcessor::process_strong_roots(OopClosure* oops, |
78 void ShenandoahRootProcessor::process_strong_roots(OopClosure* oops, |
105 CLDClosure* clds, |
79 CLDClosure* clds, |
106 CodeBlobClosure* blobs, |
80 CodeBlobClosure* blobs, |
107 ThreadClosure* thread_cl, |
81 ThreadClosure* thread_cl, |
108 uint worker_id) { |
82 uint worker_id) { |