141 {
142 MutexLocker cldg_ml(ClassLoaderDataGraph_lock);
143 unloading_occurred = SystemDictionary::do_unloading(heap->gc_timer());
144 }
145
146 Klass::clean_weak_klass_links(unloading_occurred);
147 ShenandoahCodeRoots::unlink(ShenandoahHeap::heap()->workers(), unloading_occurred);
148 DependencyContext::cleaning_end();
149 }
150
151 void ShenandoahUnload::purge() {
152 {
153 SuspendibleThreadSetJoiner sts;
154 ShenandoahCodeRoots::purge(ShenandoahHeap::heap()->workers());
155 }
156
157 ClassLoaderDataGraph::purge();
158 CodeCache::purge_exception_caches();
159 }
160
161 class ShenandoahUnloadRendezvousClosure : public ThreadClosure {
162 public:
163 void do_thread(Thread* thread) {}
164 };
165
166 void ShenandoahUnload::unload() {
167 assert(ShenandoahConcurrentRoots::can_do_concurrent_class_unloading(), "Why we here?");
168 if (!ShenandoahHeap::heap()->is_evacuation_in_progress()) {
169 return;
170 }
171
172 // Unlink stale metadata and nmethods
173 unlink();
174
175 // Make sure stale metadata and nmethods are no longer observable
176 ShenandoahUnloadRendezvousClosure cl;
177 Handshake::execute(&cl);
178
179 // Purge stale metadata and nmethods that were unlinked
180 purge();
181 }
182
|
141 {
142 MutexLocker cldg_ml(ClassLoaderDataGraph_lock);
143 unloading_occurred = SystemDictionary::do_unloading(heap->gc_timer());
144 }
145
146 Klass::clean_weak_klass_links(unloading_occurred);
147 ShenandoahCodeRoots::unlink(ShenandoahHeap::heap()->workers(), unloading_occurred);
148 DependencyContext::cleaning_end();
149 }
150
151 void ShenandoahUnload::purge() {
152 {
153 SuspendibleThreadSetJoiner sts;
154 ShenandoahCodeRoots::purge(ShenandoahHeap::heap()->workers());
155 }
156
157 ClassLoaderDataGraph::purge();
158 CodeCache::purge_exception_caches();
159 }
160
161 class ShenandoahUnloadRendezvousClosure : public HandshakeClosure {
162 public:
163 ShenandoahUnloadRendezvousClosure() : HandshakeClosure("ShenandoahUnloadRendezvous") {}
164 void do_thread(Thread* thread) {}
165 };
166
167 void ShenandoahUnload::unload() {
168 assert(ShenandoahConcurrentRoots::can_do_concurrent_class_unloading(), "Why we here?");
169 if (!ShenandoahHeap::heap()->is_evacuation_in_progress()) {
170 return;
171 }
172
173 // Unlink stale metadata and nmethods
174 unlink();
175
176 // Make sure stale metadata and nmethods are no longer observable
177 ShenandoahUnloadRendezvousClosure cl;
178 Handshake::execute(&cl);
179
180 // Purge stale metadata and nmethods that were unlinked
181 purge();
182 }
183
|