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 }
|