61 friend class ClassLoaderDataGraphMetaspaceIterator;
62 friend class VMStructs;
63 private:
64 // All CLDs (except the null CLD) can be reached by walking _head->_next->...
65 static ClassLoaderData* _head;
66 static ClassLoaderData* _unloading;
67 // CMS support.
68 static ClassLoaderData* _saved_head;
69
70 static ClassLoaderData* add(Handle class_loader, bool anonymous, TRAPS);
71 static void post_class_unload_events(void);
72 public:
73 static ClassLoaderData* find_or_create(Handle class_loader, TRAPS);
74 static void purge();
75 static void clear_claimed_marks();
76 static void oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim);
77 static void always_strong_oops_do(OopClosure* blk, KlassClosure* klass_closure, bool must_claim);
78 static void keep_alive_oops_do(OopClosure* blk, KlassClosure* klass_closure, bool must_claim);
79 static void classes_do(KlassClosure* klass_closure);
80 static void classes_do(void f(Klass* const));
81 static void loaded_classes_do(KlassClosure* klass_closure);
82 static void classes_unloading_do(void f(Klass* const));
83 static bool do_unloading(BoolObjectClosure* is_alive);
84
85 // CMS support.
86 static void remember_new_clds(bool remember) { _saved_head = (remember ? _head : NULL); }
87 static GrowableArray<ClassLoaderData*>* new_clds();
88
89 static void dump_on(outputStream * const out) PRODUCT_RETURN;
90 static void dump() { dump_on(tty); }
91 static void verify();
92
93 // expensive test for pointer in metaspace for debugging
94 static bool contains(const void* x);
95 #ifndef PRODUCT
96 static bool contains_loader_data(ClassLoaderData* loader_data);
97 #endif
98
99 #if INCLUDE_TRACE
100 private:
172 ~ClassLoaderData();
173
174 void set_metaspace(Metaspace* m) { _metaspace = m; }
175
176 JNIHandleBlock* handles() const;
177 void set_handles(JNIHandleBlock* handles);
178
179 Mutex* metaspace_lock() const { return _metaspace_lock; }
180
181 // GC interface.
182 void clear_claimed() { _claimed = 0; }
183 bool claimed() const { return _claimed == 1; }
184 bool claim();
185
186 void unload();
187 bool keep_alive() const { return _keep_alive; }
188 bool is_alive(BoolObjectClosure* is_alive_closure) const;
189 void classes_do(void f(Klass*));
190 void loaded_classes_do(KlassClosure* klass_closure);
191 void classes_do(void f(InstanceKlass*));
192
193 // Deallocate free list during class unloading.
194 void free_deallocate_list();
195
196 // Allocate out of this class loader data
197 MetaWord* allocate(size_t size);
198
199 public:
200 // Accessors
201 Metaspace* metaspace_or_null() const { return _metaspace; }
202
203 static ClassLoaderData* the_null_class_loader_data() {
204 return _the_null_class_loader_data;
205 }
206
207 bool is_anonymous() const { return _is_anonymous; }
208
209 static void init_null_class_loader_data() {
210 assert(_the_null_class_loader_data == NULL, "cannot initialize twice");
211 assert(ClassLoaderDataGraph::_head == NULL, "cannot initialize twice");
|
61 friend class ClassLoaderDataGraphMetaspaceIterator;
62 friend class VMStructs;
63 private:
64 // All CLDs (except the null CLD) can be reached by walking _head->_next->...
65 static ClassLoaderData* _head;
66 static ClassLoaderData* _unloading;
67 // CMS support.
68 static ClassLoaderData* _saved_head;
69
70 static ClassLoaderData* add(Handle class_loader, bool anonymous, TRAPS);
71 static void post_class_unload_events(void);
72 public:
73 static ClassLoaderData* find_or_create(Handle class_loader, TRAPS);
74 static void purge();
75 static void clear_claimed_marks();
76 static void oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim);
77 static void always_strong_oops_do(OopClosure* blk, KlassClosure* klass_closure, bool must_claim);
78 static void keep_alive_oops_do(OopClosure* blk, KlassClosure* klass_closure, bool must_claim);
79 static void classes_do(KlassClosure* klass_closure);
80 static void classes_do(void f(Klass* const));
81 static void methods_do(void f(Method*));
82 static void loaded_classes_do(KlassClosure* klass_closure);
83 static void classes_unloading_do(void f(Klass* const));
84 static bool do_unloading(BoolObjectClosure* is_alive);
85
86 // CMS support.
87 static void remember_new_clds(bool remember) { _saved_head = (remember ? _head : NULL); }
88 static GrowableArray<ClassLoaderData*>* new_clds();
89
90 static void dump_on(outputStream * const out) PRODUCT_RETURN;
91 static void dump() { dump_on(tty); }
92 static void verify();
93
94 // expensive test for pointer in metaspace for debugging
95 static bool contains(const void* x);
96 #ifndef PRODUCT
97 static bool contains_loader_data(ClassLoaderData* loader_data);
98 #endif
99
100 #if INCLUDE_TRACE
101 private:
173 ~ClassLoaderData();
174
175 void set_metaspace(Metaspace* m) { _metaspace = m; }
176
177 JNIHandleBlock* handles() const;
178 void set_handles(JNIHandleBlock* handles);
179
180 Mutex* metaspace_lock() const { return _metaspace_lock; }
181
182 // GC interface.
183 void clear_claimed() { _claimed = 0; }
184 bool claimed() const { return _claimed == 1; }
185 bool claim();
186
187 void unload();
188 bool keep_alive() const { return _keep_alive; }
189 bool is_alive(BoolObjectClosure* is_alive_closure) const;
190 void classes_do(void f(Klass*));
191 void loaded_classes_do(KlassClosure* klass_closure);
192 void classes_do(void f(InstanceKlass*));
193 void methods_do(void f(Method*));
194
195 // Deallocate free list during class unloading.
196 void free_deallocate_list();
197
198 // Allocate out of this class loader data
199 MetaWord* allocate(size_t size);
200
201 public:
202 // Accessors
203 Metaspace* metaspace_or_null() const { return _metaspace; }
204
205 static ClassLoaderData* the_null_class_loader_data() {
206 return _the_null_class_loader_data;
207 }
208
209 bool is_anonymous() const { return _is_anonymous; }
210
211 static void init_null_class_loader_data() {
212 assert(_the_null_class_loader_data == NULL, "cannot initialize twice");
213 assert(ClassLoaderDataGraph::_head == NULL, "cannot initialize twice");
|