83
84 #ifndef PRODUCT
85 // expensive test for pointer in metaspace for debugging
86 static bool contains(address x);
87 static bool contains_loader_data(ClassLoaderData* loader_data);
88 #endif
89 };
90
91 // ClassLoaderData class
92
93 class ClassLoaderData : public CHeapObj<mtClass> {
94 friend class VMStructs;
95 private:
96 class Dependencies VALUE_OBJ_CLASS_SPEC {
97 objArrayOop _list_head;
98 void locked_add(objArrayHandle last,
99 objArrayHandle new_dependency,
100 Thread* THREAD);
101 public:
102 Dependencies() : _list_head(NULL) {}
103 void add(Handle dependency, TRAPS);
104 void init(TRAPS);
105 void oops_do(OopClosure* f);
106 };
107
108 friend class ClassLoaderDataGraph;
109 friend class ClassLoaderDataGraphMetaspaceIterator;
110 friend class MetaDataFactory;
111 friend class Method;
112
113 static ClassLoaderData * _the_null_class_loader_data;
114
115 oop _class_loader; // oop used to uniquely identify a class loader
116 // class loader or a canonical class path
117 Dependencies _dependencies; // holds dependencies from this class loader
118 // data to others.
119
120 Metaspace * _metaspace; // Meta-space where meta-data defined by the
121 // classes in the class loader are allocated.
122 Mutex* _metaspace_lock; // Locks the metaspace for allocations and setup.
133 // These method IDs are created for the class loader and set to NULL when the
134 // class loader is unloaded. They are rarely freed, only for redefine classes
135 // and if they lose a data race in InstanceKlass.
136 JNIMethodBlock* _jmethod_ids;
137
138 // Metadata to be deallocated when it's safe at class unloading, when
139 // this class loader isn't unloaded itself.
140 GrowableArray<Metadata*>* _deallocate_list;
141
142 // Support for walking class loader data objects
143 ClassLoaderData* _next; /// Next loader_datas created
144
145 // ReadOnly and ReadWrite metaspaces (static because only on the null
146 // class loader for now).
147 static Metaspace* _ro_metaspace;
148 static Metaspace* _rw_metaspace;
149
150 void set_next(ClassLoaderData* next) { _next = next; }
151 ClassLoaderData* next() const { return _next; }
152
153 ClassLoaderData(Handle h_class_loader, bool is_anonymous);
154 ~ClassLoaderData();
155
156 void set_metaspace(Metaspace* m) { _metaspace = m; }
157
158 JNIHandleBlock* handles() const;
159 void set_handles(JNIHandleBlock* handles);
160
161 Mutex* metaspace_lock() const { return _metaspace_lock; }
162
163 // GC interface.
164 void clear_claimed() { _claimed = 0; }
165 bool claimed() const { return _claimed == 1; }
166 bool claim();
167
168 void unload();
169 bool keep_alive() const { return _keep_alive; }
170 bool is_alive(BoolObjectClosure* is_alive_closure) const;
171
172 void classes_do(void f(InstanceKlass*));
173
174 // Deallocate free list during class unloading.
175 void free_deallocate_list();
176
177 // Allocate out of this class loader data
178 MetaWord* allocate(size_t size);
179
180 public:
181 // Accessors
182 Metaspace* metaspace_or_null() const { return _metaspace; }
183
184 static ClassLoaderData* the_null_class_loader_data() {
185 return _the_null_class_loader_data;
186 }
187
188 bool is_anonymous() const { return _is_anonymous; }
189
190 static void init_null_class_loader_data() {
191 assert(_the_null_class_loader_data == NULL, "cannot initialize twice");
192 assert(ClassLoaderDataGraph::_head == NULL, "cannot initialize twice");
193 _the_null_class_loader_data = new ClassLoaderData((oop)NULL, false);
194 ClassLoaderDataGraph::_head = _the_null_class_loader_data;
195 assert(_the_null_class_loader_data->is_the_null_class_loader_data(), "Must be");
196 if (DumpSharedSpaces) {
197 _the_null_class_loader_data->initialize_shared_metaspaces();
198 }
199 }
200
201 bool is_the_null_class_loader_data() const {
202 return this == _the_null_class_loader_data;
203 }
204 bool is_ext_class_loader_data() const;
205
206 // The Metaspace is created lazily so may be NULL. This
207 // method will allocate a Metaspace if needed.
208 Metaspace* metaspace_non_null();
209
210 oop class_loader() const { return _class_loader; }
211
212 // Returns true if this class loader data is for a loader going away.
213 bool is_unloading() const {
|
83
84 #ifndef PRODUCT
85 // expensive test for pointer in metaspace for debugging
86 static bool contains(address x);
87 static bool contains_loader_data(ClassLoaderData* loader_data);
88 #endif
89 };
90
91 // ClassLoaderData class
92
93 class ClassLoaderData : public CHeapObj<mtClass> {
94 friend class VMStructs;
95 private:
96 class Dependencies VALUE_OBJ_CLASS_SPEC {
97 objArrayOop _list_head;
98 void locked_add(objArrayHandle last,
99 objArrayHandle new_dependency,
100 Thread* THREAD);
101 public:
102 Dependencies() : _list_head(NULL) {}
103 Dependencies(TRAPS) : _list_head(NULL) {
104 init(CHECK);
105 }
106 void add(Handle dependency, TRAPS);
107 void init(TRAPS);
108 void oops_do(OopClosure* f);
109 };
110
111 friend class ClassLoaderDataGraph;
112 friend class ClassLoaderDataGraphMetaspaceIterator;
113 friend class MetaDataFactory;
114 friend class Method;
115
116 static ClassLoaderData * _the_null_class_loader_data;
117
118 oop _class_loader; // oop used to uniquely identify a class loader
119 // class loader or a canonical class path
120 Dependencies _dependencies; // holds dependencies from this class loader
121 // data to others.
122
123 Metaspace * _metaspace; // Meta-space where meta-data defined by the
124 // classes in the class loader are allocated.
125 Mutex* _metaspace_lock; // Locks the metaspace for allocations and setup.
136 // These method IDs are created for the class loader and set to NULL when the
137 // class loader is unloaded. They are rarely freed, only for redefine classes
138 // and if they lose a data race in InstanceKlass.
139 JNIMethodBlock* _jmethod_ids;
140
141 // Metadata to be deallocated when it's safe at class unloading, when
142 // this class loader isn't unloaded itself.
143 GrowableArray<Metadata*>* _deallocate_list;
144
145 // Support for walking class loader data objects
146 ClassLoaderData* _next; /// Next loader_datas created
147
148 // ReadOnly and ReadWrite metaspaces (static because only on the null
149 // class loader for now).
150 static Metaspace* _ro_metaspace;
151 static Metaspace* _rw_metaspace;
152
153 void set_next(ClassLoaderData* next) { _next = next; }
154 ClassLoaderData* next() const { return _next; }
155
156 ClassLoaderData(Handle h_class_loader, bool is_anonymous, Dependencies dependencies);
157 ~ClassLoaderData();
158
159 void set_metaspace(Metaspace* m) { _metaspace = m; }
160
161 JNIHandleBlock* handles() const;
162 void set_handles(JNIHandleBlock* handles);
163
164 Mutex* metaspace_lock() const { return _metaspace_lock; }
165
166 // GC interface.
167 void clear_claimed() { _claimed = 0; }
168 bool claimed() const { return _claimed == 1; }
169 bool claim();
170
171 void unload();
172 bool keep_alive() const { return _keep_alive; }
173 bool is_alive(BoolObjectClosure* is_alive_closure) const;
174
175 void classes_do(void f(InstanceKlass*));
176
177 // Deallocate free list during class unloading.
178 void free_deallocate_list();
179
180 // Allocate out of this class loader data
181 MetaWord* allocate(size_t size);
182
183 public:
184 // Accessors
185 Metaspace* metaspace_or_null() const { return _metaspace; }
186
187 static ClassLoaderData* the_null_class_loader_data() {
188 return _the_null_class_loader_data;
189 }
190
191 bool is_anonymous() const { return _is_anonymous; }
192
193 static void init_null_class_loader_data() {
194 assert(_the_null_class_loader_data == NULL, "cannot initialize twice");
195 assert(ClassLoaderDataGraph::_head == NULL, "cannot initialize twice");
196
197 // We explicitly initialize the Dependencies object at a later phase in the initialization
198 _the_null_class_loader_data = new ClassLoaderData((oop)NULL, false, Dependencies());
199 ClassLoaderDataGraph::_head = _the_null_class_loader_data;
200 assert(_the_null_class_loader_data->is_the_null_class_loader_data(), "Must be");
201 if (DumpSharedSpaces) {
202 _the_null_class_loader_data->initialize_shared_metaspaces();
203 }
204 }
205
206 bool is_the_null_class_loader_data() const {
207 return this == _the_null_class_loader_data;
208 }
209 bool is_ext_class_loader_data() const;
210
211 // The Metaspace is created lazily so may be NULL. This
212 // method will allocate a Metaspace if needed.
213 Metaspace* metaspace_non_null();
214
215 oop class_loader() const { return _class_loader; }
216
217 // Returns true if this class loader data is for a loader going away.
218 bool is_unloading() const {
|