1 | /* |
2 | * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved. |
3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 | * |
5 | * This code is free software; you can redistribute it and/or modify it |
6 | * under the terms of the GNU General Public License version 2 only, as |
7 | * published by the Free Software Foundation. |
8 | * |
9 | * This code is distributed in the hope that it will be useful, but WITHOUT |
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
12 | * version 2 for more details (a copy is included in the LICENSE file that |
13 | * accompanied this code). |
14 | * |
15 | * You should have received a copy of the GNU General Public License version |
16 | * 2 along with this work; if not, write to the Free Software Foundation, |
17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
18 | * |
19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
20 | * or visit www.oracle.com if you need additional information or have any |
21 | * questions. |
22 | * |
23 | */ |
24 | |
25 | #include "precompiled.hpp" |
26 | #include "aot/aotLoader.hpp" |
27 | #include "classfile/classLoader.hpp" |
28 | #include "classfile/classLoaderDataGraph.hpp" |
29 | #include "classfile/javaClasses.hpp" |
30 | #include "classfile/stringTable.hpp" |
31 | #include "classfile/symbolTable.hpp" |
32 | #include "classfile/systemDictionary.hpp" |
33 | #include "classfile/vmSymbols.hpp" |
34 | #include "code/codeBehaviours.hpp" |
35 | #include "code/codeCache.hpp" |
36 | #include "code/dependencies.hpp" |
37 | #include "gc/shared/collectedHeap.inline.hpp" |
38 | #include "gc/shared/gcArguments.hpp" |
39 | #include "gc/shared/gcConfig.hpp" |
40 | #include "gc/shared/gcTraceTime.inline.hpp" |
41 | #include "interpreter/interpreter.hpp" |
42 | #include "logging/log.hpp" |
43 | #include "logging/logStream.hpp" |
44 | #include "memory/heapShared.hpp" |
45 | #include "memory/filemap.hpp" |
46 | #include "memory/metadataFactory.hpp" |
47 | #include "memory/metaspaceClosure.hpp" |
48 | #include "memory/metaspaceCounters.hpp" |
49 | #include "memory/metaspaceShared.hpp" |
50 | #include "memory/oopFactory.hpp" |
51 | #include "memory/resourceArea.hpp" |
52 | #include "memory/universe.hpp" |
53 | #include "oops/compressedOops.hpp" |
54 | #include "oops/constantPool.hpp" |
55 | #include "oops/instanceClassLoaderKlass.hpp" |
56 | #include "oops/instanceKlass.hpp" |
57 | #include "oops/instanceMirrorKlass.hpp" |
58 | #include "oops/instanceRefKlass.hpp" |
59 | #include "oops/objArrayOop.inline.hpp" |
60 | #include "oops/oop.inline.hpp" |
61 | #include "oops/typeArrayKlass.hpp" |
62 | #include "prims/resolvedMethodTable.hpp" |
63 | #include "runtime/arguments.hpp" |
64 | #include "runtime/atomic.hpp" |
65 | #include "runtime/deoptimization.hpp" |
66 | #include "runtime/flags/flagSetting.hpp" |
67 | #include "runtime/flags/jvmFlagConstraintList.hpp" |
68 | #include "runtime/handles.inline.hpp" |
69 | #include "runtime/init.hpp" |
70 | #include "runtime/java.hpp" |
71 | #include "runtime/javaCalls.hpp" |
72 | #include "runtime/sharedRuntime.hpp" |
73 | #include "runtime/synchronizer.hpp" |
74 | #include "runtime/thread.inline.hpp" |
75 | #include "runtime/timerTrace.hpp" |
76 | #include "runtime/vmOperations.hpp" |
77 | #include "services/memoryService.hpp" |
78 | #include "utilities/align.hpp" |
79 | #include "utilities/copy.hpp" |
80 | #include "utilities/debug.hpp" |
81 | #include "utilities/events.hpp" |
82 | #include "utilities/formatBuffer.hpp" |
83 | #include "utilities/hashtable.inline.hpp" |
84 | #include "utilities/macros.hpp" |
85 | #include "utilities/ostream.hpp" |
86 | #include "utilities/preserveException.hpp" |
87 | |
88 | // Known objects |
89 | Klass* Universe::_typeArrayKlassObjs[T_LONG+1] = { NULL /*, NULL...*/ }; |
90 | Klass* Universe::_objectArrayKlassObj = NULL; |
91 | oop Universe::_int_mirror = NULL; |
92 | oop Universe::_float_mirror = NULL; |
93 | oop Universe::_double_mirror = NULL; |
94 | oop Universe::_byte_mirror = NULL; |
95 | oop Universe::_bool_mirror = NULL; |
96 | oop Universe::_char_mirror = NULL; |
97 | oop Universe::_long_mirror = NULL; |
98 | oop Universe::_short_mirror = NULL; |
99 | oop Universe::_void_mirror = NULL; |
100 | oop Universe::_mirrors[T_VOID+1] = { NULL /*, NULL...*/ }; |
101 | oop Universe::_main_thread_group = NULL; |
102 | oop Universe::_system_thread_group = NULL; |
103 | objArrayOop Universe::_the_empty_class_klass_array = NULL; |
104 | Array<Klass*>* Universe::_the_array_interfaces_array = NULL; |
105 | oop Universe::_the_null_sentinel = NULL; |
106 | oop Universe::_the_null_string = NULL; |
107 | oop Universe::_the_min_jint_string = NULL; |
108 | LatestMethodCache* Universe::_finalizer_register_cache = NULL; |
109 | LatestMethodCache* Universe::_loader_addClass_cache = NULL; |
110 | LatestMethodCache* Universe::_throw_illegal_access_error_cache = NULL; |
111 | LatestMethodCache* Universe::_throw_no_such_method_error_cache = NULL; |
112 | LatestMethodCache* Universe::_do_stack_walk_cache = NULL; |
113 | oop Universe::_out_of_memory_error_java_heap = NULL; |
114 | oop Universe::_out_of_memory_error_metaspace = NULL; |
115 | oop Universe::_out_of_memory_error_class_metaspace = NULL; |
116 | oop Universe::_out_of_memory_error_array_size = NULL; |
117 | oop Universe::_out_of_memory_error_gc_overhead_limit = NULL; |
118 | oop Universe::_out_of_memory_error_realloc_objects = NULL; |
119 | oop Universe::_out_of_memory_error_retry = NULL; |
120 | oop Universe::_delayed_stack_overflow_error_message = NULL; |
121 | objArrayOop Universe::_preallocated_out_of_memory_error_array = NULL; |
122 | volatile jint Universe::_preallocated_out_of_memory_error_avail_count = 0; |
123 | bool Universe::_verify_in_progress = false; |
124 | long Universe::verify_flags = Universe::Verify_All; |
125 | oop Universe::_null_ptr_exception_instance = NULL; |
126 | oop Universe::_arithmetic_exception_instance = NULL; |
127 | oop Universe::_virtual_machine_error_instance = NULL; |
128 | oop Universe::_vm_exception = NULL; |
129 | oop Universe::_reference_pending_list = NULL; |
130 | |
131 | Array<int>* Universe::_the_empty_int_array = NULL; |
132 | Array<u2>* Universe::_the_empty_short_array = NULL; |
133 | Array<Klass*>* Universe::_the_empty_klass_array = NULL; |
134 | Array<InstanceKlass*>* Universe::_the_empty_instance_klass_array = NULL; |
135 | Array<Method*>* Universe::_the_empty_method_array = NULL; |
136 | |
137 | // These variables are guarded by FullGCALot_lock. |
138 | debug_only(objArrayOop Universe::_fullgc_alot_dummy_array = NULL;) |
139 | debug_only(int Universe::_fullgc_alot_dummy_next = 0;) |
140 | |
141 | // Heap |
142 | int Universe::_verify_count = 0; |
143 | |
144 | // Oop verification (see MacroAssembler::verify_oop) |
145 | uintptr_t Universe::_verify_oop_mask = 0; |
146 | uintptr_t Universe::_verify_oop_bits = (uintptr_t) -1; |
147 | |
148 | int Universe::_base_vtable_size = 0; |
149 | bool Universe::_bootstrapping = false; |
150 | bool Universe::_module_initialized = false; |
151 | bool Universe::_fully_initialized = false; |
152 | |
153 | size_t Universe::_heap_capacity_at_last_gc; |
154 | size_t Universe::_heap_used_at_last_gc = 0; |
155 | |
156 | CollectedHeap* Universe::_collectedHeap = NULL; |
157 | |
158 | void Universe::basic_type_classes_do(void f(Klass*)) { |
159 | for (int i = T_BOOLEAN; i < T_LONG+1; i++) { |
160 | f(_typeArrayKlassObjs[i]); |
161 | } |
162 | } |
163 | |
164 | void Universe::basic_type_classes_do(KlassClosure *closure) { |
165 | for (int i = T_BOOLEAN; i < T_LONG+1; i++) { |
166 | closure->do_klass(_typeArrayKlassObjs[i]); |
167 | } |
168 | } |
169 | |
170 | void Universe::oops_do(OopClosure* f) { |
171 | |
172 | f->do_oop((oop*) &_int_mirror); |
173 | f->do_oop((oop*) &_float_mirror); |
174 | f->do_oop((oop*) &_double_mirror); |
175 | f->do_oop((oop*) &_byte_mirror); |
176 | f->do_oop((oop*) &_bool_mirror); |
177 | f->do_oop((oop*) &_char_mirror); |
178 | f->do_oop((oop*) &_long_mirror); |
179 | f->do_oop((oop*) &_short_mirror); |
180 | f->do_oop((oop*) &_void_mirror); |
181 | |
182 | for (int i = T_BOOLEAN; i < T_VOID+1; i++) { |
183 | f->do_oop((oop*) &_mirrors[i]); |
184 | } |
185 | assert(_mirrors[0] == NULL && _mirrors[T_BOOLEAN - 1] == NULL, "checking" ); |
186 | |
187 | f->do_oop((oop*)&_the_empty_class_klass_array); |
188 | f->do_oop((oop*)&_the_null_sentinel); |
189 | f->do_oop((oop*)&_the_null_string); |
190 | f->do_oop((oop*)&_the_min_jint_string); |
191 | f->do_oop((oop*)&_out_of_memory_error_java_heap); |
192 | f->do_oop((oop*)&_out_of_memory_error_metaspace); |
193 | f->do_oop((oop*)&_out_of_memory_error_class_metaspace); |
194 | f->do_oop((oop*)&_out_of_memory_error_array_size); |
195 | f->do_oop((oop*)&_out_of_memory_error_gc_overhead_limit); |
196 | f->do_oop((oop*)&_out_of_memory_error_realloc_objects); |
197 | f->do_oop((oop*)&_out_of_memory_error_retry); |
198 | f->do_oop((oop*)&_delayed_stack_overflow_error_message); |
199 | f->do_oop((oop*)&_preallocated_out_of_memory_error_array); |
200 | f->do_oop((oop*)&_null_ptr_exception_instance); |
201 | f->do_oop((oop*)&_arithmetic_exception_instance); |
202 | f->do_oop((oop*)&_virtual_machine_error_instance); |
203 | f->do_oop((oop*)&_main_thread_group); |
204 | f->do_oop((oop*)&_system_thread_group); |
205 | f->do_oop((oop*)&_vm_exception); |
206 | f->do_oop((oop*)&_reference_pending_list); |
207 | debug_only(f->do_oop((oop*)&_fullgc_alot_dummy_array);) |
208 | } |
209 | |
210 | void LatestMethodCache::metaspace_pointers_do(MetaspaceClosure* it) { |
211 | it->push(&_klass); |
212 | } |
213 | |
214 | void Universe::metaspace_pointers_do(MetaspaceClosure* it) { |
215 | for (int i = 0; i < T_LONG+1; i++) { |
216 | it->push(&_typeArrayKlassObjs[i]); |
217 | } |
218 | it->push(&_objectArrayKlassObj); |
219 | |
220 | it->push(&_the_empty_int_array); |
221 | it->push(&_the_empty_short_array); |
222 | it->push(&_the_empty_klass_array); |
223 | it->push(&_the_empty_instance_klass_array); |
224 | it->push(&_the_empty_method_array); |
225 | it->push(&_the_array_interfaces_array); |
226 | |
227 | _finalizer_register_cache->metaspace_pointers_do(it); |
228 | _loader_addClass_cache->metaspace_pointers_do(it); |
229 | _throw_illegal_access_error_cache->metaspace_pointers_do(it); |
230 | _throw_no_such_method_error_cache->metaspace_pointers_do(it); |
231 | _do_stack_walk_cache->metaspace_pointers_do(it); |
232 | } |
233 | |
234 | // Serialize metadata and pointers to primitive type mirrors in and out of CDS archive |
235 | void Universe::serialize(SerializeClosure* f) { |
236 | |
237 | for (int i = 0; i < T_LONG+1; i++) { |
238 | f->do_ptr((void**)&_typeArrayKlassObjs[i]); |
239 | } |
240 | |
241 | f->do_ptr((void**)&_objectArrayKlassObj); |
242 | #if INCLUDE_CDS_JAVA_HEAP |
243 | #ifdef ASSERT |
244 | if (DumpSharedSpaces && !HeapShared::is_heap_object_archiving_allowed()) { |
245 | assert(_int_mirror == NULL && _float_mirror == NULL && |
246 | _double_mirror == NULL && _byte_mirror == NULL && |
247 | _bool_mirror == NULL && _char_mirror == NULL && |
248 | _long_mirror == NULL && _short_mirror == NULL && |
249 | _void_mirror == NULL, "mirrors should be NULL" ); |
250 | } |
251 | #endif |
252 | f->do_oop(&_int_mirror); |
253 | f->do_oop(&_float_mirror); |
254 | f->do_oop(&_double_mirror); |
255 | f->do_oop(&_byte_mirror); |
256 | f->do_oop(&_bool_mirror); |
257 | f->do_oop(&_char_mirror); |
258 | f->do_oop(&_long_mirror); |
259 | f->do_oop(&_short_mirror); |
260 | f->do_oop(&_void_mirror); |
261 | #endif |
262 | |
263 | f->do_ptr((void**)&_the_array_interfaces_array); |
264 | f->do_ptr((void**)&_the_empty_int_array); |
265 | f->do_ptr((void**)&_the_empty_short_array); |
266 | f->do_ptr((void**)&_the_empty_method_array); |
267 | f->do_ptr((void**)&_the_empty_klass_array); |
268 | f->do_ptr((void**)&_the_empty_instance_klass_array); |
269 | _finalizer_register_cache->serialize(f); |
270 | _loader_addClass_cache->serialize(f); |
271 | _throw_illegal_access_error_cache->serialize(f); |
272 | _throw_no_such_method_error_cache->serialize(f); |
273 | _do_stack_walk_cache->serialize(f); |
274 | } |
275 | |
276 | void Universe::check_alignment(uintx size, uintx alignment, const char* name) { |
277 | if (size < alignment || size % alignment != 0) { |
278 | vm_exit_during_initialization( |
279 | err_msg("Size of %s (" UINTX_FORMAT " bytes) must be aligned to " UINTX_FORMAT " bytes" , name, size, alignment)); |
280 | } |
281 | } |
282 | |
283 | void initialize_basic_type_klass(Klass* k, TRAPS) { |
284 | Klass* ok = SystemDictionary::Object_klass(); |
285 | #if INCLUDE_CDS |
286 | if (UseSharedSpaces) { |
287 | ClassLoaderData* loader_data = ClassLoaderData::the_null_class_loader_data(); |
288 | assert(k->super() == ok, "u3" ); |
289 | k->restore_unshareable_info(loader_data, Handle(), CHECK); |
290 | } else |
291 | #endif |
292 | { |
293 | k->initialize_supers(ok, NULL, CHECK); |
294 | } |
295 | k->append_to_sibling_list(); |
296 | } |
297 | |
298 | void Universe::genesis(TRAPS) { |
299 | ResourceMark rm; |
300 | |
301 | { FlagSetting fs(_bootstrapping, true); |
302 | |
303 | { MutexLocker mc(Compile_lock); |
304 | |
305 | java_lang_Class::allocate_fixup_lists(); |
306 | |
307 | // determine base vtable size; without that we cannot create the array klasses |
308 | compute_base_vtable_size(); |
309 | |
310 | if (!UseSharedSpaces) { |
311 | for (int i = T_BOOLEAN; i < T_LONG+1; i++) { |
312 | _typeArrayKlassObjs[i] = TypeArrayKlass::create_klass((BasicType)i, CHECK); |
313 | } |
314 | |
315 | ClassLoaderData* null_cld = ClassLoaderData::the_null_class_loader_data(); |
316 | |
317 | _the_array_interfaces_array = MetadataFactory::new_array<Klass*>(null_cld, 2, NULL, CHECK); |
318 | _the_empty_int_array = MetadataFactory::new_array<int>(null_cld, 0, CHECK); |
319 | _the_empty_short_array = MetadataFactory::new_array<u2>(null_cld, 0, CHECK); |
320 | _the_empty_method_array = MetadataFactory::new_array<Method*>(null_cld, 0, CHECK); |
321 | _the_empty_klass_array = MetadataFactory::new_array<Klass*>(null_cld, 0, CHECK); |
322 | _the_empty_instance_klass_array = MetadataFactory::new_array<InstanceKlass*>(null_cld, 0, CHECK); |
323 | } |
324 | } |
325 | |
326 | vmSymbols::initialize(CHECK); |
327 | |
328 | SystemDictionary::initialize(CHECK); |
329 | |
330 | Klass* ok = SystemDictionary::Object_klass(); |
331 | |
332 | _the_null_string = StringTable::intern("null" , CHECK); |
333 | _the_min_jint_string = StringTable::intern("-2147483648" , CHECK); |
334 | |
335 | #if INCLUDE_CDS |
336 | if (UseSharedSpaces) { |
337 | // Verify shared interfaces array. |
338 | assert(_the_array_interfaces_array->at(0) == |
339 | SystemDictionary::Cloneable_klass(), "u3" ); |
340 | assert(_the_array_interfaces_array->at(1) == |
341 | SystemDictionary::Serializable_klass(), "u3" ); |
342 | } else |
343 | #endif |
344 | { |
345 | // Set up shared interfaces array. (Do this before supers are set up.) |
346 | _the_array_interfaces_array->at_put(0, SystemDictionary::Cloneable_klass()); |
347 | _the_array_interfaces_array->at_put(1, SystemDictionary::Serializable_klass()); |
348 | } |
349 | |
350 | initialize_basic_type_klass(boolArrayKlassObj(), CHECK); |
351 | initialize_basic_type_klass(charArrayKlassObj(), CHECK); |
352 | initialize_basic_type_klass(floatArrayKlassObj(), CHECK); |
353 | initialize_basic_type_klass(doubleArrayKlassObj(), CHECK); |
354 | initialize_basic_type_klass(byteArrayKlassObj(), CHECK); |
355 | initialize_basic_type_klass(shortArrayKlassObj(), CHECK); |
356 | initialize_basic_type_klass(intArrayKlassObj(), CHECK); |
357 | initialize_basic_type_klass(longArrayKlassObj(), CHECK); |
358 | } // end of core bootstrapping |
359 | |
360 | { |
361 | Handle tns = java_lang_String::create_from_str("<null_sentinel>" , CHECK); |
362 | _the_null_sentinel = tns(); |
363 | } |
364 | |
365 | // Maybe this could be lifted up now that object array can be initialized |
366 | // during the bootstrapping. |
367 | |
368 | // OLD |
369 | // Initialize _objectArrayKlass after core bootstraping to make |
370 | // sure the super class is set up properly for _objectArrayKlass. |
371 | // --- |
372 | // NEW |
373 | // Since some of the old system object arrays have been converted to |
374 | // ordinary object arrays, _objectArrayKlass will be loaded when |
375 | // SystemDictionary::initialize(CHECK); is run. See the extra check |
376 | // for Object_klass_loaded in objArrayKlassKlass::allocate_objArray_klass_impl. |
377 | _objectArrayKlassObj = InstanceKlass:: |
378 | cast(SystemDictionary::Object_klass())->array_klass(1, CHECK); |
379 | // OLD |
380 | // Add the class to the class hierarchy manually to make sure that |
381 | // its vtable is initialized after core bootstrapping is completed. |
382 | // --- |
383 | // New |
384 | // Have already been initialized. |
385 | _objectArrayKlassObj->append_to_sibling_list(); |
386 | |
387 | #ifdef ASSERT |
388 | if (FullGCALot) { |
389 | // Allocate an array of dummy objects. |
390 | // We'd like these to be at the bottom of the old generation, |
391 | // so that when we free one and then collect, |
392 | // (almost) the whole heap moves |
393 | // and we find out if we actually update all the oops correctly. |
394 | // But we can't allocate directly in the old generation, |
395 | // so we allocate wherever, and hope that the first collection |
396 | // moves these objects to the bottom of the old generation. |
397 | // We can allocate directly in the permanent generation, so we do. |
398 | int size; |
399 | if (UseConcMarkSweepGC) { |
400 | log_warning(gc)("Using +FullGCALot with concurrent mark sweep gc will not force all objects to relocate" ); |
401 | size = FullGCALotDummies; |
402 | } else { |
403 | size = FullGCALotDummies * 2; |
404 | } |
405 | objArrayOop naked_array = oopFactory::new_objArray(SystemDictionary::Object_klass(), size, CHECK); |
406 | objArrayHandle dummy_array(THREAD, naked_array); |
407 | int i = 0; |
408 | while (i < size) { |
409 | // Allocate dummy in old generation |
410 | oop dummy = SystemDictionary::Object_klass()->allocate_instance(CHECK); |
411 | dummy_array->obj_at_put(i++, dummy); |
412 | } |
413 | { |
414 | // Only modify the global variable inside the mutex. |
415 | // If we had a race to here, the other dummy_array instances |
416 | // and their elements just get dropped on the floor, which is fine. |
417 | MutexLocker ml(FullGCALot_lock); |
418 | if (_fullgc_alot_dummy_array == NULL) { |
419 | _fullgc_alot_dummy_array = dummy_array(); |
420 | } |
421 | } |
422 | assert(i == _fullgc_alot_dummy_array->length(), "just checking" ); |
423 | } |
424 | #endif |
425 | } |
426 | |
427 | void Universe::initialize_basic_type_mirrors(TRAPS) { |
428 | #if INCLUDE_CDS_JAVA_HEAP |
429 | if (UseSharedSpaces && |
430 | HeapShared::open_archive_heap_region_mapped() && |
431 | _int_mirror != NULL) { |
432 | assert(HeapShared::is_heap_object_archiving_allowed(), "Sanity" ); |
433 | assert(_float_mirror != NULL && _double_mirror != NULL && |
434 | _byte_mirror != NULL && _byte_mirror != NULL && |
435 | _bool_mirror != NULL && _char_mirror != NULL && |
436 | _long_mirror != NULL && _short_mirror != NULL && |
437 | _void_mirror != NULL, "Sanity" ); |
438 | } else |
439 | #endif |
440 | { |
441 | _int_mirror = |
442 | java_lang_Class::create_basic_type_mirror("int" , T_INT, CHECK); |
443 | _float_mirror = |
444 | java_lang_Class::create_basic_type_mirror("float" , T_FLOAT, CHECK); |
445 | _double_mirror = |
446 | java_lang_Class::create_basic_type_mirror("double" , T_DOUBLE, CHECK); |
447 | _byte_mirror = |
448 | java_lang_Class::create_basic_type_mirror("byte" , T_BYTE, CHECK); |
449 | _bool_mirror = |
450 | java_lang_Class::create_basic_type_mirror("boolean" ,T_BOOLEAN, CHECK); |
451 | _char_mirror = |
452 | java_lang_Class::create_basic_type_mirror("char" , T_CHAR, CHECK); |
453 | _long_mirror = |
454 | java_lang_Class::create_basic_type_mirror("long" , T_LONG, CHECK); |
455 | _short_mirror = |
456 | java_lang_Class::create_basic_type_mirror("short" , T_SHORT, CHECK); |
457 | _void_mirror = |
458 | java_lang_Class::create_basic_type_mirror("void" , T_VOID, CHECK); |
459 | } |
460 | |
461 | _mirrors[T_INT] = _int_mirror; |
462 | _mirrors[T_FLOAT] = _float_mirror; |
463 | _mirrors[T_DOUBLE] = _double_mirror; |
464 | _mirrors[T_BYTE] = _byte_mirror; |
465 | _mirrors[T_BOOLEAN] = _bool_mirror; |
466 | _mirrors[T_CHAR] = _char_mirror; |
467 | _mirrors[T_LONG] = _long_mirror; |
468 | _mirrors[T_SHORT] = _short_mirror; |
469 | _mirrors[T_VOID] = _void_mirror; |
470 | //_mirrors[T_OBJECT] = _object_klass->java_mirror(); |
471 | //_mirrors[T_ARRAY] = _object_klass->java_mirror(); |
472 | } |
473 | |
474 | void Universe::fixup_mirrors(TRAPS) { |
475 | // Bootstrap problem: all classes gets a mirror (java.lang.Class instance) assigned eagerly, |
476 | // but we cannot do that for classes created before java.lang.Class is loaded. Here we simply |
477 | // walk over permanent objects created so far (mostly classes) and fixup their mirrors. Note |
478 | // that the number of objects allocated at this point is very small. |
479 | assert(SystemDictionary::Class_klass_loaded(), "java.lang.Class should be loaded" ); |
480 | HandleMark hm(THREAD); |
481 | |
482 | if (!UseSharedSpaces) { |
483 | // Cache the start of the static fields |
484 | InstanceMirrorKlass::init_offset_of_static_fields(); |
485 | } |
486 | |
487 | GrowableArray <Klass*>* list = java_lang_Class::fixup_mirror_list(); |
488 | int list_length = list->length(); |
489 | for (int i = 0; i < list_length; i++) { |
490 | Klass* k = list->at(i); |
491 | assert(k->is_klass(), "List should only hold classes" ); |
492 | EXCEPTION_MARK; |
493 | java_lang_Class::fixup_mirror(k, CATCH); |
494 | } |
495 | delete java_lang_Class::fixup_mirror_list(); |
496 | java_lang_Class::set_fixup_mirror_list(NULL); |
497 | } |
498 | |
499 | #define assert_pll_locked(test) \ |
500 | assert(Heap_lock->test(), "Reference pending list access requires lock") |
501 | |
502 | #define assert_pll_ownership() assert_pll_locked(owned_by_self) |
503 | |
504 | oop Universe::reference_pending_list() { |
505 | if (Thread::current()->is_VM_thread()) { |
506 | assert_pll_locked(is_locked); |
507 | } else { |
508 | assert_pll_ownership(); |
509 | } |
510 | return _reference_pending_list; |
511 | } |
512 | |
513 | void Universe::set_reference_pending_list(oop list) { |
514 | assert_pll_ownership(); |
515 | _reference_pending_list = list; |
516 | } |
517 | |
518 | bool Universe::has_reference_pending_list() { |
519 | assert_pll_ownership(); |
520 | return _reference_pending_list != NULL; |
521 | } |
522 | |
523 | oop Universe::swap_reference_pending_list(oop list) { |
524 | assert_pll_locked(is_locked); |
525 | return Atomic::xchg(list, &_reference_pending_list); |
526 | } |
527 | |
528 | #undef assert_pll_locked |
529 | #undef assert_pll_ownership |
530 | |
531 | void Universe::reinitialize_vtable_of(Klass* ko, TRAPS) { |
532 | // init vtable of k and all subclasses |
533 | ko->vtable().initialize_vtable(false, CHECK); |
534 | if (ko->is_instance_klass()) { |
535 | for (Klass* sk = ko->subklass(); |
536 | sk != NULL; |
537 | sk = sk->next_sibling()) { |
538 | reinitialize_vtable_of(sk, CHECK); |
539 | } |
540 | } |
541 | } |
542 | |
543 | void Universe::reinitialize_vtables(TRAPS) { |
544 | // The vtables are initialized by starting at java.lang.Object and |
545 | // initializing through the subclass links, so that the super |
546 | // classes are always initialized first. |
547 | Klass* ok = SystemDictionary::Object_klass(); |
548 | Universe::reinitialize_vtable_of(ok, THREAD); |
549 | } |
550 | |
551 | |
552 | void initialize_itable_for_klass(InstanceKlass* k, TRAPS) { |
553 | k->itable().initialize_itable(false, CHECK); |
554 | } |
555 | |
556 | |
557 | void Universe::reinitialize_itables(TRAPS) { |
558 | MutexLocker mcld(ClassLoaderDataGraph_lock); |
559 | ClassLoaderDataGraph::dictionary_classes_do(initialize_itable_for_klass, CHECK); |
560 | } |
561 | |
562 | |
563 | bool Universe::on_page_boundary(void* addr) { |
564 | return is_aligned(addr, os::vm_page_size()); |
565 | } |
566 | |
567 | |
568 | bool Universe::should_fill_in_stack_trace(Handle throwable) { |
569 | // never attempt to fill in the stack trace of preallocated errors that do not have |
570 | // backtrace. These errors are kept alive forever and may be "re-used" when all |
571 | // preallocated errors with backtrace have been consumed. Also need to avoid |
572 | // a potential loop which could happen if an out of memory occurs when attempting |
573 | // to allocate the backtrace. |
574 | return ((!oopDesc::equals(throwable(), Universe::_out_of_memory_error_java_heap)) && |
575 | (!oopDesc::equals(throwable(), Universe::_out_of_memory_error_metaspace)) && |
576 | (!oopDesc::equals(throwable(), Universe::_out_of_memory_error_class_metaspace)) && |
577 | (!oopDesc::equals(throwable(), Universe::_out_of_memory_error_array_size)) && |
578 | (!oopDesc::equals(throwable(), Universe::_out_of_memory_error_gc_overhead_limit)) && |
579 | (!oopDesc::equals(throwable(), Universe::_out_of_memory_error_realloc_objects)) && |
580 | (!oopDesc::equals(throwable(), Universe::_out_of_memory_error_retry))); |
581 | } |
582 | |
583 | |
584 | oop Universe::gen_out_of_memory_error(oop default_err) { |
585 | // generate an out of memory error: |
586 | // - if there is a preallocated error and stack traces are available |
587 | // (j.l.Throwable is initialized), then return the preallocated |
588 | // error with a filled in stack trace, and with the message |
589 | // provided by the default error. |
590 | // - otherwise, return the default error, without a stack trace. |
591 | int next; |
592 | if ((_preallocated_out_of_memory_error_avail_count > 0) && |
593 | SystemDictionary::Throwable_klass()->is_initialized()) { |
594 | next = (int)Atomic::add(-1, &_preallocated_out_of_memory_error_avail_count); |
595 | assert(next < (int)PreallocatedOutOfMemoryErrorCount, "avail count is corrupt" ); |
596 | } else { |
597 | next = -1; |
598 | } |
599 | if (next < 0) { |
600 | // all preallocated errors have been used. |
601 | // return default |
602 | return default_err; |
603 | } else { |
604 | Thread* THREAD = Thread::current(); |
605 | Handle default_err_h(THREAD, default_err); |
606 | // get the error object at the slot and set set it to NULL so that the |
607 | // array isn't keeping it alive anymore. |
608 | Handle exc(THREAD, preallocated_out_of_memory_errors()->obj_at(next)); |
609 | assert(exc() != NULL, "slot has been used already" ); |
610 | preallocated_out_of_memory_errors()->obj_at_put(next, NULL); |
611 | |
612 | // use the message from the default error |
613 | oop msg = java_lang_Throwable::message(default_err_h()); |
614 | assert(msg != NULL, "no message" ); |
615 | java_lang_Throwable::set_message(exc(), msg); |
616 | |
617 | // populate the stack trace and return it. |
618 | java_lang_Throwable::fill_in_stack_trace_of_preallocated_backtrace(exc); |
619 | return exc(); |
620 | } |
621 | } |
622 | |
623 | intptr_t Universe::_non_oop_bits = 0; |
624 | |
625 | void* Universe::non_oop_word() { |
626 | // Neither the high bits nor the low bits of this value is allowed |
627 | // to look like (respectively) the high or low bits of a real oop. |
628 | // |
629 | // High and low are CPU-specific notions, but low always includes |
630 | // the low-order bit. Since oops are always aligned at least mod 4, |
631 | // setting the low-order bit will ensure that the low half of the |
632 | // word will never look like that of a real oop. |
633 | // |
634 | // Using the OS-supplied non-memory-address word (usually 0 or -1) |
635 | // will take care of the high bits, however many there are. |
636 | |
637 | if (_non_oop_bits == 0) { |
638 | _non_oop_bits = (intptr_t)os::non_memory_address_word() | 1; |
639 | } |
640 | |
641 | return (void*)_non_oop_bits; |
642 | } |
643 | |
644 | static void initialize_global_behaviours() { |
645 | CompiledICProtectionBehaviour::set_current(new DefaultICProtectionBehaviour()); |
646 | } |
647 | |
648 | jint universe_init() { |
649 | assert(!Universe::_fully_initialized, "called after initialize_vtables" ); |
650 | guarantee(1 << LogHeapWordSize == sizeof(HeapWord), |
651 | "LogHeapWordSize is incorrect." ); |
652 | guarantee(sizeof(oop) >= sizeof(HeapWord), "HeapWord larger than oop?" ); |
653 | guarantee(sizeof(oop) % sizeof(HeapWord) == 0, |
654 | "oop size is not not a multiple of HeapWord size" ); |
655 | |
656 | TraceTime timer("Genesis" , TRACETIME_LOG(Info, startuptime)); |
657 | |
658 | JavaClasses::compute_hard_coded_offsets(); |
659 | |
660 | initialize_global_behaviours(); |
661 | |
662 | GCConfig::arguments()->initialize_heap_sizes(); |
663 | |
664 | jint status = Universe::initialize_heap(); |
665 | if (status != JNI_OK) { |
666 | return status; |
667 | } |
668 | |
669 | CompressedOops::initialize(); |
670 | |
671 | Universe::initialize_tlab(); |
672 | |
673 | SystemDictionary::initialize_oop_storage(); |
674 | |
675 | Metaspace::global_initialize(); |
676 | |
677 | // Initialize performance counters for metaspaces |
678 | MetaspaceCounters::initialize_performance_counters(); |
679 | CompressedClassSpaceCounters::initialize_performance_counters(); |
680 | |
681 | AOTLoader::universe_init(); |
682 | |
683 | // Checks 'AfterMemoryInit' constraints. |
684 | if (!JVMFlagConstraintList::check_constraints(JVMFlagConstraint::AfterMemoryInit)) { |
685 | return JNI_EINVAL; |
686 | } |
687 | |
688 | // Create memory for metadata. Must be after initializing heap for |
689 | // DumpSharedSpaces. |
690 | ClassLoaderData::init_null_class_loader_data(); |
691 | |
692 | // We have a heap so create the Method* caches before |
693 | // Metaspace::initialize_shared_spaces() tries to populate them. |
694 | Universe::_finalizer_register_cache = new LatestMethodCache(); |
695 | Universe::_loader_addClass_cache = new LatestMethodCache(); |
696 | Universe::_throw_illegal_access_error_cache = new LatestMethodCache(); |
697 | Universe::_throw_no_such_method_error_cache = new LatestMethodCache(); |
698 | Universe::_do_stack_walk_cache = new LatestMethodCache(); |
699 | |
700 | #if INCLUDE_CDS |
701 | if (UseSharedSpaces) { |
702 | // Read the data structures supporting the shared spaces (shared |
703 | // system dictionary, symbol table, etc.). After that, access to |
704 | // the file (other than the mapped regions) is no longer needed, and |
705 | // the file is closed. Closing the file does not affect the |
706 | // currently mapped regions. |
707 | MetaspaceShared::initialize_shared_spaces(); |
708 | StringTable::create_table(); |
709 | } else |
710 | #endif |
711 | { |
712 | SymbolTable::create_table(); |
713 | StringTable::create_table(); |
714 | } |
715 | |
716 | #if INCLUDE_CDS |
717 | if (DumpSharedSpaces || DynamicDumpSharedSpaces) { |
718 | MetaspaceShared::prepare_for_dumping(); |
719 | } |
720 | #endif |
721 | |
722 | if (strlen(VerifySubSet) > 0) { |
723 | Universe::initialize_verify_flags(); |
724 | } |
725 | |
726 | ResolvedMethodTable::create_table(); |
727 | |
728 | return JNI_OK; |
729 | } |
730 | |
731 | jint Universe::initialize_heap() { |
732 | assert(_collectedHeap == NULL, "Heap already created" ); |
733 | _collectedHeap = GCConfig::arguments()->create_heap(); |
734 | jint status = _collectedHeap->initialize(); |
735 | |
736 | if (status == JNI_OK) { |
737 | log_info(gc)("Using %s" , _collectedHeap->name()); |
738 | } |
739 | |
740 | return status; |
741 | } |
742 | |
743 | void Universe::initialize_tlab() { |
744 | ThreadLocalAllocBuffer::set_max_size(Universe::heap()->max_tlab_size()); |
745 | if (UseTLAB) { |
746 | assert(Universe::heap()->supports_tlab_allocation(), |
747 | "Should support thread-local allocation buffers" ); |
748 | ThreadLocalAllocBuffer::startup_initialization(); |
749 | } |
750 | } |
751 | |
752 | ReservedSpace Universe::reserve_heap(size_t heap_size, size_t alignment) { |
753 | |
754 | assert(alignment <= Arguments::conservative_max_heap_alignment(), |
755 | "actual alignment " SIZE_FORMAT " must be within maximum heap alignment " SIZE_FORMAT, |
756 | alignment, Arguments::conservative_max_heap_alignment()); |
757 | |
758 | size_t total_reserved = align_up(heap_size, alignment); |
759 | assert(!UseCompressedOops || (total_reserved <= (OopEncodingHeapMax - os::vm_page_size())), |
760 | "heap size is too big for compressed oops" ); |
761 | |
762 | bool use_large_pages = UseLargePages && is_aligned(alignment, os::large_page_size()); |
763 | assert(!UseLargePages |
764 | || UseParallelGC |
765 | || use_large_pages, "Wrong alignment to use large pages" ); |
766 | |
767 | // Now create the space. |
768 | ReservedHeapSpace total_rs(total_reserved, alignment, use_large_pages, AllocateHeapAt); |
769 | |
770 | if (total_rs.is_reserved()) { |
771 | assert((total_reserved == total_rs.size()) && ((uintptr_t)total_rs.base() % alignment == 0), |
772 | "must be exactly of required size and alignment" ); |
773 | // We are good. |
774 | |
775 | if (UseCompressedOops) { |
776 | // Universe::initialize_heap() will reset this to NULL if unscaled |
777 | // or zero-based narrow oops are actually used. |
778 | // Else heap start and base MUST differ, so that NULL can be encoded nonambigous. |
779 | CompressedOops::set_base((address)total_rs.compressed_oop_base()); |
780 | } |
781 | |
782 | if (AllocateHeapAt != NULL) { |
783 | log_info(gc,heap)("Successfully allocated Java heap at location %s" , AllocateHeapAt); |
784 | } |
785 | return total_rs; |
786 | } |
787 | |
788 | vm_exit_during_initialization( |
789 | err_msg("Could not reserve enough space for " SIZE_FORMAT "KB object heap" , |
790 | total_reserved/K)); |
791 | |
792 | // satisfy compiler |
793 | ShouldNotReachHere(); |
794 | return ReservedHeapSpace(0, 0, false); |
795 | } |
796 | |
797 | |
798 | // It's the caller's responsibility to ensure glitch-freedom |
799 | // (if required). |
800 | void Universe::update_heap_info_at_gc() { |
801 | _heap_capacity_at_last_gc = heap()->capacity(); |
802 | _heap_used_at_last_gc = heap()->used(); |
803 | } |
804 | |
805 | void initialize_known_method(LatestMethodCache* method_cache, |
806 | InstanceKlass* ik, |
807 | const char* method, |
808 | Symbol* signature, |
809 | bool is_static, TRAPS) |
810 | { |
811 | TempNewSymbol name = SymbolTable::new_symbol(method); |
812 | Method* m = NULL; |
813 | // The klass must be linked before looking up the method. |
814 | if (!ik->link_class_or_fail(THREAD) || |
815 | ((m = ik->find_method(name, signature)) == NULL) || |
816 | is_static != m->is_static()) { |
817 | ResourceMark rm(THREAD); |
818 | // NoSuchMethodException doesn't actually work because it tries to run the |
819 | // <init> function before java_lang_Class is linked. Print error and exit. |
820 | vm_exit_during_initialization(err_msg("Unable to link/verify %s.%s method" , |
821 | ik->name()->as_C_string(), method)); |
822 | } |
823 | method_cache->init(ik, m); |
824 | } |
825 | |
826 | void Universe::initialize_known_methods(TRAPS) { |
827 | // Set up static method for registering finalizers |
828 | initialize_known_method(_finalizer_register_cache, |
829 | SystemDictionary::Finalizer_klass(), |
830 | "register" , |
831 | vmSymbols::object_void_signature(), true, CHECK); |
832 | |
833 | initialize_known_method(_throw_illegal_access_error_cache, |
834 | SystemDictionary::internal_Unsafe_klass(), |
835 | "throwIllegalAccessError" , |
836 | vmSymbols::void_method_signature(), true, CHECK); |
837 | |
838 | initialize_known_method(_throw_no_such_method_error_cache, |
839 | SystemDictionary::internal_Unsafe_klass(), |
840 | "throwNoSuchMethodError" , |
841 | vmSymbols::void_method_signature(), true, CHECK); |
842 | |
843 | // Set up method for registering loaded classes in class loader vector |
844 | initialize_known_method(_loader_addClass_cache, |
845 | SystemDictionary::ClassLoader_klass(), |
846 | "addClass" , |
847 | vmSymbols::class_void_signature(), false, CHECK); |
848 | |
849 | // Set up method for stack walking |
850 | initialize_known_method(_do_stack_walk_cache, |
851 | SystemDictionary::AbstractStackWalker_klass(), |
852 | "doStackWalk" , |
853 | vmSymbols::doStackWalk_signature(), false, CHECK); |
854 | } |
855 | |
856 | void universe2_init() { |
857 | EXCEPTION_MARK; |
858 | Universe::genesis(CATCH); |
859 | } |
860 | |
861 | // Set after initialization of the module runtime, call_initModuleRuntime |
862 | void universe_post_module_init() { |
863 | Universe::_module_initialized = true; |
864 | } |
865 | |
866 | bool universe_post_init() { |
867 | assert(!is_init_completed(), "Error: initialization not yet completed!" ); |
868 | Universe::_fully_initialized = true; |
869 | EXCEPTION_MARK; |
870 | { ResourceMark rm; |
871 | Interpreter::initialize(); // needed for interpreter entry points |
872 | if (!UseSharedSpaces) { |
873 | Universe::reinitialize_vtables(CHECK_false); |
874 | Universe::reinitialize_itables(CHECK_false); |
875 | } |
876 | } |
877 | |
878 | HandleMark hm(THREAD); |
879 | // Setup preallocated empty java.lang.Class array |
880 | Universe::_the_empty_class_klass_array = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_false); |
881 | |
882 | // Setup preallocated OutOfMemoryError errors |
883 | Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_OutOfMemoryError(), true, CHECK_false); |
884 | InstanceKlass* ik = InstanceKlass::cast(k); |
885 | Universe::_out_of_memory_error_java_heap = ik->allocate_instance(CHECK_false); |
886 | Universe::_out_of_memory_error_metaspace = ik->allocate_instance(CHECK_false); |
887 | Universe::_out_of_memory_error_class_metaspace = ik->allocate_instance(CHECK_false); |
888 | Universe::_out_of_memory_error_array_size = ik->allocate_instance(CHECK_false); |
889 | Universe::_out_of_memory_error_gc_overhead_limit = |
890 | ik->allocate_instance(CHECK_false); |
891 | Universe::_out_of_memory_error_realloc_objects = ik->allocate_instance(CHECK_false); |
892 | Universe::_out_of_memory_error_retry = ik->allocate_instance(CHECK_false); |
893 | |
894 | // Setup preallocated cause message for delayed StackOverflowError |
895 | if (StackReservedPages > 0) { |
896 | Universe::_delayed_stack_overflow_error_message = |
897 | java_lang_String::create_oop_from_str("Delayed StackOverflowError due to ReservedStackAccess annotated method" , CHECK_false); |
898 | } |
899 | |
900 | // Setup preallocated NullPointerException |
901 | // (this is currently used for a cheap & dirty solution in compiler exception handling) |
902 | k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_NullPointerException(), true, CHECK_false); |
903 | Universe::_null_ptr_exception_instance = InstanceKlass::cast(k)->allocate_instance(CHECK_false); |
904 | // Setup preallocated ArithmeticException |
905 | // (this is currently used for a cheap & dirty solution in compiler exception handling) |
906 | k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_ArithmeticException(), true, CHECK_false); |
907 | Universe::_arithmetic_exception_instance = InstanceKlass::cast(k)->allocate_instance(CHECK_false); |
908 | // Virtual Machine Error for when we get into a situation we can't resolve |
909 | k = SystemDictionary::resolve_or_fail( |
910 | vmSymbols::java_lang_VirtualMachineError(), true, CHECK_false); |
911 | bool linked = InstanceKlass::cast(k)->link_class_or_fail(CHECK_false); |
912 | if (!linked) { |
913 | tty->print_cr("Unable to link/verify VirtualMachineError class" ); |
914 | return false; // initialization failed |
915 | } |
916 | Universe::_virtual_machine_error_instance = |
917 | InstanceKlass::cast(k)->allocate_instance(CHECK_false); |
918 | |
919 | Universe::_vm_exception = InstanceKlass::cast(k)->allocate_instance(CHECK_false); |
920 | |
921 | Handle msg = java_lang_String::create_from_str("Java heap space" , CHECK_false); |
922 | java_lang_Throwable::set_message(Universe::_out_of_memory_error_java_heap, msg()); |
923 | |
924 | msg = java_lang_String::create_from_str("Metaspace" , CHECK_false); |
925 | java_lang_Throwable::set_message(Universe::_out_of_memory_error_metaspace, msg()); |
926 | msg = java_lang_String::create_from_str("Compressed class space" , CHECK_false); |
927 | java_lang_Throwable::set_message(Universe::_out_of_memory_error_class_metaspace, msg()); |
928 | |
929 | msg = java_lang_String::create_from_str("Requested array size exceeds VM limit" , CHECK_false); |
930 | java_lang_Throwable::set_message(Universe::_out_of_memory_error_array_size, msg()); |
931 | |
932 | msg = java_lang_String::create_from_str("GC overhead limit exceeded" , CHECK_false); |
933 | java_lang_Throwable::set_message(Universe::_out_of_memory_error_gc_overhead_limit, msg()); |
934 | |
935 | msg = java_lang_String::create_from_str("Java heap space: failed reallocation of scalar replaced objects" , CHECK_false); |
936 | java_lang_Throwable::set_message(Universe::_out_of_memory_error_realloc_objects, msg()); |
937 | |
938 | msg = java_lang_String::create_from_str("Java heap space: failed retryable allocation" , CHECK_false); |
939 | java_lang_Throwable::set_message(Universe::_out_of_memory_error_retry, msg()); |
940 | |
941 | msg = java_lang_String::create_from_str("/ by zero" , CHECK_false); |
942 | java_lang_Throwable::set_message(Universe::_arithmetic_exception_instance, msg()); |
943 | |
944 | // Setup the array of errors that have preallocated backtrace |
945 | k = Universe::_out_of_memory_error_java_heap->klass(); |
946 | assert(k->name() == vmSymbols::java_lang_OutOfMemoryError(), "should be out of memory error" ); |
947 | ik = InstanceKlass::cast(k); |
948 | |
949 | int len = (StackTraceInThrowable) ? (int)PreallocatedOutOfMemoryErrorCount : 0; |
950 | Universe::_preallocated_out_of_memory_error_array = oopFactory::new_objArray(ik, len, CHECK_false); |
951 | for (int i=0; i<len; i++) { |
952 | oop err = ik->allocate_instance(CHECK_false); |
953 | Handle err_h = Handle(THREAD, err); |
954 | java_lang_Throwable::allocate_backtrace(err_h, CHECK_false); |
955 | Universe::preallocated_out_of_memory_errors()->obj_at_put(i, err_h()); |
956 | } |
957 | Universe::_preallocated_out_of_memory_error_avail_count = (jint)len; |
958 | |
959 | Universe::initialize_known_methods(CHECK_false); |
960 | |
961 | // This needs to be done before the first scavenge/gc, since |
962 | // it's an input to soft ref clearing policy. |
963 | { |
964 | MutexLocker x(Heap_lock); |
965 | Universe::update_heap_info_at_gc(); |
966 | } |
967 | |
968 | // ("weak") refs processing infrastructure initialization |
969 | Universe::heap()->post_initialize(); |
970 | |
971 | MemoryService::add_metaspace_memory_pools(); |
972 | |
973 | MemoryService::set_universe_heap(Universe::heap()); |
974 | #if INCLUDE_CDS |
975 | MetaspaceShared::post_initialize(CHECK_false); |
976 | #endif |
977 | return true; |
978 | } |
979 | |
980 | |
981 | void Universe::compute_base_vtable_size() { |
982 | _base_vtable_size = ClassLoader::compute_Object_vtable(); |
983 | } |
984 | |
985 | void Universe::print_on(outputStream* st) { |
986 | GCMutexLocker hl(Heap_lock); // Heap_lock might be locked by caller thread. |
987 | st->print_cr("Heap" ); |
988 | heap()->print_on(st); |
989 | } |
990 | |
991 | void Universe::print_heap_at_SIGBREAK() { |
992 | if (PrintHeapAtSIGBREAK) { |
993 | print_on(tty); |
994 | tty->cr(); |
995 | tty->flush(); |
996 | } |
997 | } |
998 | |
999 | void Universe::print_heap_before_gc() { |
1000 | LogTarget(Debug, gc, heap) lt; |
1001 | if (lt.is_enabled()) { |
1002 | LogStream ls(lt); |
1003 | ls.print("Heap before GC invocations=%u (full %u):" , heap()->total_collections(), heap()->total_full_collections()); |
1004 | ResourceMark rm; |
1005 | heap()->print_on(&ls); |
1006 | } |
1007 | } |
1008 | |
1009 | void Universe::print_heap_after_gc() { |
1010 | LogTarget(Debug, gc, heap) lt; |
1011 | if (lt.is_enabled()) { |
1012 | LogStream ls(lt); |
1013 | ls.print("Heap after GC invocations=%u (full %u):" , heap()->total_collections(), heap()->total_full_collections()); |
1014 | ResourceMark rm; |
1015 | heap()->print_on(&ls); |
1016 | } |
1017 | } |
1018 | |
1019 | void Universe::initialize_verify_flags() { |
1020 | verify_flags = 0; |
1021 | const char delimiter[] = " ," ; |
1022 | |
1023 | size_t length = strlen(VerifySubSet); |
1024 | char* subset_list = NEW_C_HEAP_ARRAY(char, length + 1, mtInternal); |
1025 | strncpy(subset_list, VerifySubSet, length + 1); |
1026 | char* save_ptr; |
1027 | |
1028 | char* token = strtok_r(subset_list, delimiter, &save_ptr); |
1029 | while (token != NULL) { |
1030 | if (strcmp(token, "threads" ) == 0) { |
1031 | verify_flags |= Verify_Threads; |
1032 | } else if (strcmp(token, "heap" ) == 0) { |
1033 | verify_flags |= Verify_Heap; |
1034 | } else if (strcmp(token, "symbol_table" ) == 0) { |
1035 | verify_flags |= Verify_SymbolTable; |
1036 | } else if (strcmp(token, "string_table" ) == 0) { |
1037 | verify_flags |= Verify_StringTable; |
1038 | } else if (strcmp(token, "codecache" ) == 0) { |
1039 | verify_flags |= Verify_CodeCache; |
1040 | } else if (strcmp(token, "dictionary" ) == 0) { |
1041 | verify_flags |= Verify_SystemDictionary; |
1042 | } else if (strcmp(token, "classloader_data_graph" ) == 0) { |
1043 | verify_flags |= Verify_ClassLoaderDataGraph; |
1044 | } else if (strcmp(token, "metaspace" ) == 0) { |
1045 | verify_flags |= Verify_MetaspaceUtils; |
1046 | } else if (strcmp(token, "jni_handles" ) == 0) { |
1047 | verify_flags |= Verify_JNIHandles; |
1048 | } else if (strcmp(token, "codecache_oops" ) == 0) { |
1049 | verify_flags |= Verify_CodeCacheOops; |
1050 | } else if (strcmp(token, "resolved_method_table" ) == 0) { |
1051 | verify_flags |= Verify_ResolvedMethodTable; |
1052 | } else { |
1053 | vm_exit_during_initialization(err_msg("VerifySubSet: \'%s\' memory sub-system is unknown, please correct it" , token)); |
1054 | } |
1055 | token = strtok_r(NULL, delimiter, &save_ptr); |
1056 | } |
1057 | FREE_C_HEAP_ARRAY(char, subset_list); |
1058 | } |
1059 | |
1060 | bool Universe::should_verify_subset(uint subset) { |
1061 | if (verify_flags & subset) { |
1062 | return true; |
1063 | } |
1064 | return false; |
1065 | } |
1066 | |
1067 | void Universe::verify(VerifyOption option, const char* prefix) { |
1068 | // The use of _verify_in_progress is a temporary work around for |
1069 | // 6320749. Don't bother with a creating a class to set and clear |
1070 | // it since it is only used in this method and the control flow is |
1071 | // straight forward. |
1072 | _verify_in_progress = true; |
1073 | |
1074 | COMPILER2_PRESENT( |
1075 | assert(!DerivedPointerTable::is_active(), |
1076 | "DPT should not be active during verification " |
1077 | "(of thread stacks below)" ); |
1078 | ) |
1079 | |
1080 | ResourceMark rm; |
1081 | HandleMark hm; // Handles created during verification can be zapped |
1082 | _verify_count++; |
1083 | |
1084 | FormatBuffer<> title("Verifying %s" , prefix); |
1085 | GCTraceTime(Info, gc, verify) tm(title.buffer()); |
1086 | if (should_verify_subset(Verify_Threads)) { |
1087 | log_debug(gc, verify)("Threads" ); |
1088 | Threads::verify(); |
1089 | } |
1090 | if (should_verify_subset(Verify_Heap)) { |
1091 | log_debug(gc, verify)("Heap" ); |
1092 | heap()->verify(option); |
1093 | } |
1094 | if (should_verify_subset(Verify_SymbolTable)) { |
1095 | log_debug(gc, verify)("SymbolTable" ); |
1096 | SymbolTable::verify(); |
1097 | } |
1098 | if (should_verify_subset(Verify_StringTable)) { |
1099 | log_debug(gc, verify)("StringTable" ); |
1100 | StringTable::verify(); |
1101 | } |
1102 | if (should_verify_subset(Verify_CodeCache)) { |
1103 | { |
1104 | MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); |
1105 | log_debug(gc, verify)("CodeCache" ); |
1106 | CodeCache::verify(); |
1107 | } |
1108 | } |
1109 | if (should_verify_subset(Verify_SystemDictionary)) { |
1110 | log_debug(gc, verify)("SystemDictionary" ); |
1111 | SystemDictionary::verify(); |
1112 | } |
1113 | #ifndef PRODUCT |
1114 | if (should_verify_subset(Verify_ClassLoaderDataGraph)) { |
1115 | log_debug(gc, verify)("ClassLoaderDataGraph" ); |
1116 | ClassLoaderDataGraph::verify(); |
1117 | } |
1118 | #endif |
1119 | if (should_verify_subset(Verify_MetaspaceUtils)) { |
1120 | log_debug(gc, verify)("MetaspaceUtils" ); |
1121 | MetaspaceUtils::verify_free_chunks(); |
1122 | } |
1123 | if (should_verify_subset(Verify_JNIHandles)) { |
1124 | log_debug(gc, verify)("JNIHandles" ); |
1125 | JNIHandles::verify(); |
1126 | } |
1127 | if (should_verify_subset(Verify_CodeCacheOops)) { |
1128 | log_debug(gc, verify)("CodeCache Oops" ); |
1129 | CodeCache::verify_oops(); |
1130 | } |
1131 | if (should_verify_subset(Verify_ResolvedMethodTable)) { |
1132 | log_debug(gc, verify)("ResolvedMethodTable Oops" ); |
1133 | ResolvedMethodTable::verify(); |
1134 | } |
1135 | |
1136 | _verify_in_progress = false; |
1137 | } |
1138 | |
1139 | |
1140 | #ifndef PRODUCT |
1141 | void Universe::calculate_verify_data(HeapWord* low_boundary, HeapWord* high_boundary) { |
1142 | assert(low_boundary < high_boundary, "bad interval" ); |
1143 | |
1144 | // decide which low-order bits we require to be clear: |
1145 | size_t alignSize = MinObjAlignmentInBytes; |
1146 | size_t min_object_size = CollectedHeap::min_fill_size(); |
1147 | |
1148 | // make an inclusive limit: |
1149 | uintptr_t max = (uintptr_t)high_boundary - min_object_size*wordSize; |
1150 | uintptr_t min = (uintptr_t)low_boundary; |
1151 | assert(min < max, "bad interval" ); |
1152 | uintptr_t diff = max ^ min; |
1153 | |
1154 | // throw away enough low-order bits to make the diff vanish |
1155 | uintptr_t mask = (uintptr_t)(-1); |
1156 | while ((mask & diff) != 0) |
1157 | mask <<= 1; |
1158 | uintptr_t bits = (min & mask); |
1159 | assert(bits == (max & mask), "correct mask" ); |
1160 | // check an intermediate value between min and max, just to make sure: |
1161 | assert(bits == ((min + (max-min)/2) & mask), "correct mask" ); |
1162 | |
1163 | // require address alignment, too: |
1164 | mask |= (alignSize - 1); |
1165 | |
1166 | if (!(_verify_oop_mask == 0 && _verify_oop_bits == (uintptr_t)-1)) { |
1167 | assert(_verify_oop_mask == mask && _verify_oop_bits == bits, "mask stability" ); |
1168 | } |
1169 | _verify_oop_mask = mask; |
1170 | _verify_oop_bits = bits; |
1171 | } |
1172 | |
1173 | // Oop verification (see MacroAssembler::verify_oop) |
1174 | |
1175 | uintptr_t Universe::verify_oop_mask() { |
1176 | MemRegion m = heap()->reserved_region(); |
1177 | calculate_verify_data(m.start(), m.end()); |
1178 | return _verify_oop_mask; |
1179 | } |
1180 | |
1181 | uintptr_t Universe::verify_oop_bits() { |
1182 | MemRegion m = heap()->reserved_region(); |
1183 | calculate_verify_data(m.start(), m.end()); |
1184 | return _verify_oop_bits; |
1185 | } |
1186 | |
1187 | uintptr_t Universe::verify_mark_mask() { |
1188 | return markOopDesc::lock_mask_in_place; |
1189 | } |
1190 | |
1191 | uintptr_t Universe::verify_mark_bits() { |
1192 | intptr_t mask = verify_mark_mask(); |
1193 | intptr_t bits = (intptr_t)markOopDesc::prototype(); |
1194 | assert((bits & ~mask) == 0, "no stray header bits" ); |
1195 | return bits; |
1196 | } |
1197 | #endif // PRODUCT |
1198 | |
1199 | |
1200 | void LatestMethodCache::init(Klass* k, Method* m) { |
1201 | if (!UseSharedSpaces) { |
1202 | _klass = k; |
1203 | } |
1204 | #ifndef PRODUCT |
1205 | else { |
1206 | // sharing initilization should have already set up _klass |
1207 | assert(_klass != NULL, "just checking" ); |
1208 | } |
1209 | #endif |
1210 | |
1211 | _method_idnum = m->method_idnum(); |
1212 | assert(_method_idnum >= 0, "sanity check" ); |
1213 | } |
1214 | |
1215 | |
1216 | Method* LatestMethodCache::get_method() { |
1217 | if (klass() == NULL) return NULL; |
1218 | InstanceKlass* ik = InstanceKlass::cast(klass()); |
1219 | Method* m = ik->method_with_idnum(method_idnum()); |
1220 | assert(m != NULL, "sanity check" ); |
1221 | return m; |
1222 | } |
1223 | |
1224 | |
1225 | #ifdef ASSERT |
1226 | // Release dummy object(s) at bottom of heap |
1227 | bool Universe::release_fullgc_alot_dummy() { |
1228 | MutexLocker ml(FullGCALot_lock); |
1229 | if (_fullgc_alot_dummy_array != NULL) { |
1230 | if (_fullgc_alot_dummy_next >= _fullgc_alot_dummy_array->length()) { |
1231 | // No more dummies to release, release entire array instead |
1232 | _fullgc_alot_dummy_array = NULL; |
1233 | return false; |
1234 | } |
1235 | if (!UseConcMarkSweepGC) { |
1236 | // Release dummy at bottom of old generation |
1237 | _fullgc_alot_dummy_array->obj_at_put(_fullgc_alot_dummy_next++, NULL); |
1238 | } |
1239 | // Release dummy at bottom of permanent generation |
1240 | _fullgc_alot_dummy_array->obj_at_put(_fullgc_alot_dummy_next++, NULL); |
1241 | } |
1242 | return true; |
1243 | } |
1244 | |
1245 | #endif // ASSERT |
1246 | |