95 _modules(NULL), _packages(NULL), |
95 _modules(NULL), _packages(NULL), |
96 _claimed(0), _jmethod_ids(NULL), _handles(NULL), _deallocate_list(NULL), |
96 _claimed(0), _jmethod_ids(NULL), _handles(NULL), _deallocate_list(NULL), |
97 _next(NULL), _dependencies(dependencies), _shared_class_loader_id(-1), |
97 _next(NULL), _dependencies(dependencies), _shared_class_loader_id(-1), |
98 _metaspace_lock(new Mutex(Monitor::leaf+1, "Metaspace allocation lock", true, |
98 _metaspace_lock(new Mutex(Monitor::leaf+1, "Metaspace allocation lock", true, |
99 Monitor::_safepoint_check_never)) { |
99 Monitor::_safepoint_check_never)) { |
100 // empty |
100 TRACE_INIT_ID(this); |
101 } |
101 } |
102 |
102 |
103 void ClassLoaderData::init_dependencies(TRAPS) { |
103 void ClassLoaderData::init_dependencies(TRAPS) { |
104 assert(!Universe::is_fully_initialized(), "should only be called when initializing"); |
104 assert(!Universe::is_fully_initialized(), "should only be called when initializing"); |
105 assert(is_the_null_class_loader_data(), "should only call this for the null class loader"); |
105 assert(is_the_null_class_loader_data(), "should only call this for the null class loader"); |
165 assert(k != k->next_link(), "no loops!"); |
165 assert(k != k->next_link(), "no loops!"); |
166 } |
166 } |
167 } |
167 } |
168 |
168 |
169 void ClassLoaderData::classes_do(void f(Klass * const)) { |
169 void ClassLoaderData::classes_do(void f(Klass * const)) { |
170 assert_locked_or_safepoint(_metaspace_lock); |
170 // Lock-free access requires load_ptr_acquire |
171 for (Klass* k = _klasses; k != NULL; k = k->next_link()) { |
171 for (Klass* k = load_ptr_acquire(&_klasses); k != NULL; k = k->next_link()) { |
172 f(k); |
172 f(k); |
|
173 assert(k != k->next_link(), "no loops!"); |
173 } |
174 } |
174 } |
175 } |
175 |
176 |
176 void ClassLoaderData::methods_do(void f(Method*)) { |
177 void ClassLoaderData::methods_do(void f(Method*)) { |
177 // Lock-free access requires load_ptr_acquire |
178 // Lock-free access requires load_ptr_acquire |
810 for (ClassLoaderData* cld = _head; cl != NULL && cld != NULL; cld = cld->next()) { |
811 for (ClassLoaderData* cld = _head; cl != NULL && cld != NULL; cld = cld->next()) { |
811 cl->do_cld(cld); |
812 cl->do_cld(cld); |
812 } |
813 } |
813 } |
814 } |
814 |
815 |
|
816 void ClassLoaderDataGraph::cld_unloading_do(CLDClosure* cl) { |
|
817 assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!"); |
|
818 // Only walk the head until any clds not purged from prior unloading |
|
819 // (CMS doesn't purge right away). |
|
820 for (ClassLoaderData* cld = _unloading; cld != _saved_unloading; cld = cld->next()) { |
|
821 assert(cld->is_unloading(), "invariant"); |
|
822 cl->do_cld(cld); |
|
823 } |
|
824 } |
|
825 |
815 void ClassLoaderDataGraph::roots_cld_do(CLDClosure* strong, CLDClosure* weak) { |
826 void ClassLoaderDataGraph::roots_cld_do(CLDClosure* strong, CLDClosure* weak) { |
816 for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->_next) { |
827 for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->_next) { |
817 CLDClosure* closure = cld->keep_alive() ? strong : weak; |
828 CLDClosure* closure = cld->keep_alive() ? strong : weak; |
818 if (closure != NULL) { |
829 if (closure != NULL) { |
819 closure->do_cld(cld); |
830 closure->do_cld(cld); |
1040 Metaspace::purge(); |
1051 Metaspace::purge(); |
1041 set_metaspace_oom(false); |
1052 set_metaspace_oom(false); |
1042 } |
1053 } |
1043 } |
1054 } |
1044 |
1055 |
1045 void ClassLoaderDataGraph::post_class_unload_events(void) { |
1056 void ClassLoaderDataGraph::post_class_unload_events() { |
1046 #if INCLUDE_TRACE |
1057 #if INCLUDE_TRACE |
1047 assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!"); |
1058 assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!"); |
1048 if (Tracing::enabled()) { |
1059 if (Tracing::enabled()) { |
1049 if (Tracing::is_event_enabled(TraceClassUnloadEvent)) { |
1060 if (Tracing::is_event_enabled(TraceClassUnloadEvent)) { |
1050 assert(_unloading != NULL, "need class loader data unload list!"); |
1061 assert(_unloading != NULL, "need class loader data unload list!"); |
1189 |
1200 |
1190 // post class unload event |
1201 // post class unload event |
1191 EventClassUnload event(UNTIMED); |
1202 EventClassUnload event(UNTIMED); |
1192 event.set_endtime(_class_unload_time); |
1203 event.set_endtime(_class_unload_time); |
1193 event.set_unloadedClass(k); |
1204 event.set_unloadedClass(k); |
1194 oop defining_class_loader = k->class_loader(); |
1205 event.set_definingClassLoader(k->class_loader_data()); |
1195 event.set_definingClassLoader(defining_class_loader != NULL ? |
|
1196 defining_class_loader->klass() : (Klass*)NULL); |
|
1197 event.commit(); |
1206 event.commit(); |
1198 } |
1207 } |
1199 |
1208 |
1200 #endif // INCLUDE_TRACE |
1209 #endif // INCLUDE_TRACE |