equal
deleted
inserted
replaced
29 #include "memory/memRegion.hpp" |
29 #include "memory/memRegion.hpp" |
30 #include "memory/metaspace.hpp" |
30 #include "memory/metaspace.hpp" |
31 #include "oops/oopHandle.hpp" |
31 #include "oops/oopHandle.hpp" |
32 #include "oops/weakHandle.hpp" |
32 #include "oops/weakHandle.hpp" |
33 #include "runtime/mutex.hpp" |
33 #include "runtime/mutex.hpp" |
34 #include "trace/traceMacros.hpp" |
|
35 #include "utilities/growableArray.hpp" |
34 #include "utilities/growableArray.hpp" |
36 #include "utilities/macros.hpp" |
35 #include "utilities/macros.hpp" |
37 #if INCLUDE_TRACE |
36 #if INCLUDE_JFR |
38 #include "utilities/ticks.hpp" |
37 #include "jfr/support/jfrTraceIdExtension.hpp" |
39 #endif |
38 #endif |
|
39 |
40 |
40 |
41 // |
41 // |
42 // A class loader represents a linkset. Conceptually, a linkset identifies |
42 // A class loader represents a linkset. Conceptually, a linkset identifies |
43 // the complete transitive closure of resolved links that a dynamic linker can |
43 // the complete transitive closure of resolved links that a dynamic linker can |
44 // produce. |
44 // produce. |
83 static volatile size_t _num_instance_classes; |
83 static volatile size_t _num_instance_classes; |
84 static volatile size_t _num_array_classes; |
84 static volatile size_t _num_array_classes; |
85 |
85 |
86 static ClassLoaderData* add_to_graph(Handle class_loader, bool anonymous); |
86 static ClassLoaderData* add_to_graph(Handle class_loader, bool anonymous); |
87 static ClassLoaderData* add(Handle class_loader, bool anonymous); |
87 static ClassLoaderData* add(Handle class_loader, bool anonymous); |
88 static void post_class_unload_events(); |
|
89 public: |
88 public: |
90 static ClassLoaderData* find_or_create(Handle class_loader); |
89 static ClassLoaderData* find_or_create(Handle class_loader); |
91 static void purge(); |
90 static void purge(); |
92 static void clear_claimed_marks(); |
91 static void clear_claimed_marks(); |
93 // oops do |
92 // oops do |
165 static inline void dec_array_classes(size_t count); |
164 static inline void dec_array_classes(size_t count); |
166 |
165 |
167 #ifndef PRODUCT |
166 #ifndef PRODUCT |
168 static bool contains_loader_data(ClassLoaderData* loader_data); |
167 static bool contains_loader_data(ClassLoaderData* loader_data); |
169 #endif |
168 #endif |
170 |
|
171 #if INCLUDE_TRACE |
|
172 private: |
|
173 static Ticks _class_unload_time; |
|
174 static void class_unload_event(Klass* const k); |
|
175 #endif |
|
176 }; |
169 }; |
177 |
170 |
178 // ClassLoaderData class |
171 // ClassLoaderData class |
179 |
172 |
180 class ClassLoaderData : public CHeapObj<mtClass> { |
173 class ClassLoaderData : public CHeapObj<mtClass> { |
266 ClassLoaderData* _next; /// Next loader_datas created |
259 ClassLoaderData* _next; /// Next loader_datas created |
267 |
260 |
268 // JFR support |
261 // JFR support |
269 Klass* _class_loader_klass; |
262 Klass* _class_loader_klass; |
270 Symbol* _class_loader_name; |
263 Symbol* _class_loader_name; |
271 TRACE_DEFINE_TRACE_ID_FIELD; |
264 JFR_ONLY(DEFINE_TRACE_ID_FIELD;) |
272 |
265 |
273 void set_next(ClassLoaderData* next) { _next = next; } |
266 void set_next(ClassLoaderData* next) { _next = next; } |
274 ClassLoaderData* next() const { return _next; } |
267 ClassLoaderData* next() const { return _next; } |
275 |
268 |
276 ClassLoaderData(Handle h_class_loader, bool is_anonymous); |
269 ClassLoaderData(Handle h_class_loader, bool is_anonymous); |
408 static ClassLoaderData* anonymous_class_loader_data(Handle loader); |
401 static ClassLoaderData* anonymous_class_loader_data(Handle loader); |
409 |
402 |
410 |
403 |
411 Klass* class_loader_klass() const { return _class_loader_klass; } |
404 Klass* class_loader_klass() const { return _class_loader_klass; } |
412 Symbol* class_loader_name() const { return _class_loader_name; } |
405 Symbol* class_loader_name() const { return _class_loader_name; } |
413 TRACE_DEFINE_TRACE_ID_METHODS; |
406 JFR_ONLY(DEFINE_TRACE_ID_METHODS;) |
414 }; |
407 }; |
415 |
408 |
416 // An iterator that distributes Klasses to parallel worker threads. |
409 // An iterator that distributes Klasses to parallel worker threads. |
417 class ClassLoaderDataGraphKlassIteratorAtomic : public StackObj { |
410 class ClassLoaderDataGraphKlassIteratorAtomic : public StackObj { |
418 Klass* volatile _next_klass; |
411 Klass* volatile _next_klass; |