| 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 | |