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