src/share/vm/memory/universe.cpp

Wed, 11 Sep 2013 16:25:02 +0200

author
tschatzl
date
Wed, 11 Sep 2013 16:25:02 +0200
changeset 5701
40136aa2cdb1
parent 5694
7944aba7ba41
child 5711
23ae5a04724d
permissions
-rw-r--r--

8010722: assert: failed: heap size is too big for compressed oops
Summary: Use conservative assumptions of required alignment for the various garbage collector components into account when determining the maximum heap size that supports compressed oops. Using this conservative value avoids several circular dependencies in the calculation.
Reviewed-by: stefank, dholmes

duke@435 1 /*
hseigel@4465 2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
duke@435 22 *
duke@435 23 */
duke@435 24
stefank@2314 25 #include "precompiled.hpp"
stefank@2314 26 #include "classfile/classLoader.hpp"
coleenp@4037 27 #include "classfile/classLoaderData.hpp"
stefank@2314 28 #include "classfile/javaClasses.hpp"
stefank@2314 29 #include "classfile/symbolTable.hpp"
stefank@2314 30 #include "classfile/systemDictionary.hpp"
stefank@2314 31 #include "classfile/vmSymbols.hpp"
stefank@2314 32 #include "code/codeCache.hpp"
stefank@2314 33 #include "code/dependencies.hpp"
stefank@2314 34 #include "gc_interface/collectedHeap.inline.hpp"
stefank@2314 35 #include "interpreter/interpreter.hpp"
stefank@2314 36 #include "memory/cardTableModRefBS.hpp"
stefank@2314 37 #include "memory/gcLocker.inline.hpp"
stefank@2314 38 #include "memory/genCollectedHeap.hpp"
stefank@2314 39 #include "memory/genRemSet.hpp"
stefank@2314 40 #include "memory/generation.hpp"
coleenp@4037 41 #include "memory/metadataFactory.hpp"
coleenp@4037 42 #include "memory/metaspaceShared.hpp"
stefank@2314 43 #include "memory/oopFactory.hpp"
stefank@2314 44 #include "memory/space.hpp"
stefank@2314 45 #include "memory/universe.hpp"
stefank@2314 46 #include "memory/universe.inline.hpp"
coleenp@4037 47 #include "oops/constantPool.hpp"
coleenp@4037 48 #include "oops/instanceClassLoaderKlass.hpp"
stefank@2314 49 #include "oops/instanceKlass.hpp"
never@2658 50 #include "oops/instanceMirrorKlass.hpp"
stefank@2314 51 #include "oops/instanceRefKlass.hpp"
stefank@2314 52 #include "oops/oop.inline.hpp"
stefank@2314 53 #include "oops/typeArrayKlass.hpp"
stefank@2314 54 #include "prims/jvmtiRedefineClassesTrace.hpp"
stefank@2314 55 #include "runtime/arguments.hpp"
stefank@2314 56 #include "runtime/deoptimization.hpp"
stefank@2314 57 #include "runtime/fprofiler.hpp"
stefank@2314 58 #include "runtime/handles.inline.hpp"
stefank@2314 59 #include "runtime/init.hpp"
stefank@2314 60 #include "runtime/java.hpp"
stefank@2314 61 #include "runtime/javaCalls.hpp"
stefank@2314 62 #include "runtime/sharedRuntime.hpp"
stefank@2314 63 #include "runtime/synchronizer.hpp"
stefank@4299 64 #include "runtime/thread.inline.hpp"
stefank@2314 65 #include "runtime/timer.hpp"
stefank@2314 66 #include "runtime/vm_operations.hpp"
stefank@2314 67 #include "services/memoryService.hpp"
stefank@2314 68 #include "utilities/copy.hpp"
stefank@2314 69 #include "utilities/events.hpp"
stefank@2314 70 #include "utilities/hashtable.inline.hpp"
stefank@2314 71 #include "utilities/preserveException.hpp"
jprovino@4542 72 #include "utilities/macros.hpp"
jprovino@4542 73 #if INCLUDE_ALL_GCS
stefank@2314 74 #include "gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.hpp"
stefank@2314 75 #include "gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.hpp"
stefank@2314 76 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
stefank@2314 77 #include "gc_implementation/g1/g1CollectorPolicy.hpp"
stefank@2314 78 #include "gc_implementation/parallelScavenge/parallelScavengeHeap.hpp"
jprovino@4542 79 #endif // INCLUDE_ALL_GCS
duke@435 80
duke@435 81 // Known objects
coleenp@4037 82 Klass* Universe::_boolArrayKlassObj = NULL;
coleenp@4037 83 Klass* Universe::_byteArrayKlassObj = NULL;
coleenp@4037 84 Klass* Universe::_charArrayKlassObj = NULL;
coleenp@4037 85 Klass* Universe::_intArrayKlassObj = NULL;
coleenp@4037 86 Klass* Universe::_shortArrayKlassObj = NULL;
coleenp@4037 87 Klass* Universe::_longArrayKlassObj = NULL;
coleenp@4037 88 Klass* Universe::_singleArrayKlassObj = NULL;
coleenp@4037 89 Klass* Universe::_doubleArrayKlassObj = NULL;
coleenp@4037 90 Klass* Universe::_typeArrayKlassObjs[T_VOID+1] = { NULL /*, NULL...*/ };
coleenp@4037 91 Klass* Universe::_objectArrayKlassObj = NULL;
jcoomes@916 92 oop Universe::_int_mirror = NULL;
jcoomes@916 93 oop Universe::_float_mirror = NULL;
jcoomes@916 94 oop Universe::_double_mirror = NULL;
jcoomes@916 95 oop Universe::_byte_mirror = NULL;
jcoomes@916 96 oop Universe::_bool_mirror = NULL;
jcoomes@916 97 oop Universe::_char_mirror = NULL;
jcoomes@916 98 oop Universe::_long_mirror = NULL;
jcoomes@916 99 oop Universe::_short_mirror = NULL;
jcoomes@916 100 oop Universe::_void_mirror = NULL;
jcoomes@916 101 oop Universe::_mirrors[T_VOID+1] = { NULL /*, NULL...*/ };
duke@435 102 oop Universe::_main_thread_group = NULL;
duke@435 103 oop Universe::_system_thread_group = NULL;
duke@435 104 objArrayOop Universe::_the_empty_class_klass_array = NULL;
coleenp@4037 105 Array<Klass*>* Universe::_the_array_interfaces_array = NULL;
never@1515 106 oop Universe::_the_null_string = NULL;
never@1515 107 oop Universe::_the_min_jint_string = NULL;
coleenp@5508 108 LatestMethodCache* Universe::_finalizer_register_cache = NULL;
coleenp@5508 109 LatestMethodCache* Universe::_loader_addClass_cache = NULL;
coleenp@5508 110 LatestMethodCache* Universe::_pd_implies_cache = NULL;
duke@435 111 oop Universe::_out_of_memory_error_java_heap = NULL;
coleenp@5337 112 oop Universe::_out_of_memory_error_metaspace = NULL;
coleenp@5337 113 oop Universe::_out_of_memory_error_class_metaspace = NULL;
duke@435 114 oop Universe::_out_of_memory_error_array_size = NULL;
duke@435 115 oop Universe::_out_of_memory_error_gc_overhead_limit = NULL;
duke@435 116 objArrayOop Universe::_preallocated_out_of_memory_error_array = NULL;
duke@435 117 volatile jint Universe::_preallocated_out_of_memory_error_avail_count = 0;
duke@435 118 bool Universe::_verify_in_progress = false;
duke@435 119 oop Universe::_null_ptr_exception_instance = NULL;
duke@435 120 oop Universe::_arithmetic_exception_instance = NULL;
duke@435 121 oop Universe::_virtual_machine_error_instance = NULL;
duke@435 122 oop Universe::_vm_exception = NULL;
coleenp@4037 123 Array<int>* Universe::_the_empty_int_array = NULL;
coleenp@4037 124 Array<u2>* Universe::_the_empty_short_array = NULL;
coleenp@4037 125 Array<Klass*>* Universe::_the_empty_klass_array = NULL;
coleenp@4037 126 Array<Method*>* Universe::_the_empty_method_array = NULL;
duke@435 127
duke@435 128 // These variables are guarded by FullGCALot_lock.
duke@435 129 debug_only(objArrayOop Universe::_fullgc_alot_dummy_array = NULL;)
duke@435 130 debug_only(int Universe::_fullgc_alot_dummy_next = 0;)
duke@435 131
duke@435 132 // Heap
duke@435 133 int Universe::_verify_count = 0;
duke@435 134
duke@435 135 int Universe::_base_vtable_size = 0;
duke@435 136 bool Universe::_bootstrapping = false;
duke@435 137 bool Universe::_fully_initialized = false;
duke@435 138
duke@435 139 size_t Universe::_heap_capacity_at_last_gc;
ysr@888 140 size_t Universe::_heap_used_at_last_gc = 0;
duke@435 141
duke@435 142 CollectedHeap* Universe::_collectedHeap = NULL;
kvn@1077 143
roland@4159 144 NarrowPtrStruct Universe::_narrow_oop = { NULL, 0, true };
roland@4159 145 NarrowPtrStruct Universe::_narrow_klass = { NULL, 0, true };
roland@4159 146 address Universe::_narrow_ptrs_base;
duke@435 147
coleenp@4037 148 void Universe::basic_type_classes_do(void f(Klass*)) {
duke@435 149 f(boolArrayKlassObj());
duke@435 150 f(byteArrayKlassObj());
duke@435 151 f(charArrayKlassObj());
duke@435 152 f(intArrayKlassObj());
duke@435 153 f(shortArrayKlassObj());
duke@435 154 f(longArrayKlassObj());
duke@435 155 f(singleArrayKlassObj());
duke@435 156 f(doubleArrayKlassObj());
duke@435 157 }
duke@435 158
duke@435 159 void Universe::oops_do(OopClosure* f, bool do_all) {
duke@435 160
duke@435 161 f->do_oop((oop*) &_int_mirror);
duke@435 162 f->do_oop((oop*) &_float_mirror);
duke@435 163 f->do_oop((oop*) &_double_mirror);
duke@435 164 f->do_oop((oop*) &_byte_mirror);
duke@435 165 f->do_oop((oop*) &_bool_mirror);
duke@435 166 f->do_oop((oop*) &_char_mirror);
duke@435 167 f->do_oop((oop*) &_long_mirror);
duke@435 168 f->do_oop((oop*) &_short_mirror);
duke@435 169 f->do_oop((oop*) &_void_mirror);
duke@435 170
duke@435 171 for (int i = T_BOOLEAN; i < T_VOID+1; i++) {
duke@435 172 f->do_oop((oop*) &_mirrors[i]);
duke@435 173 }
duke@435 174 assert(_mirrors[0] == NULL && _mirrors[T_BOOLEAN - 1] == NULL, "checking");
duke@435 175
duke@435 176 f->do_oop((oop*)&_the_empty_class_klass_array);
never@1515 177 f->do_oop((oop*)&_the_null_string);
never@1515 178 f->do_oop((oop*)&_the_min_jint_string);
duke@435 179 f->do_oop((oop*)&_out_of_memory_error_java_heap);
coleenp@5337 180 f->do_oop((oop*)&_out_of_memory_error_metaspace);
coleenp@5337 181 f->do_oop((oop*)&_out_of_memory_error_class_metaspace);
duke@435 182 f->do_oop((oop*)&_out_of_memory_error_array_size);
duke@435 183 f->do_oop((oop*)&_out_of_memory_error_gc_overhead_limit);
duke@435 184 f->do_oop((oop*)&_preallocated_out_of_memory_error_array);
duke@435 185 f->do_oop((oop*)&_null_ptr_exception_instance);
duke@435 186 f->do_oop((oop*)&_arithmetic_exception_instance);
duke@435 187 f->do_oop((oop*)&_virtual_machine_error_instance);
duke@435 188 f->do_oop((oop*)&_main_thread_group);
duke@435 189 f->do_oop((oop*)&_system_thread_group);
duke@435 190 f->do_oop((oop*)&_vm_exception);
duke@435 191 debug_only(f->do_oop((oop*)&_fullgc_alot_dummy_array);)
duke@435 192 }
duke@435 193
coleenp@4037 194 // Serialize metadata in and out of CDS archive, not oops.
coleenp@4037 195 void Universe::serialize(SerializeClosure* f, bool do_all) {
coleenp@4037 196
coleenp@4037 197 f->do_ptr((void**)&_boolArrayKlassObj);
coleenp@4037 198 f->do_ptr((void**)&_byteArrayKlassObj);
coleenp@4037 199 f->do_ptr((void**)&_charArrayKlassObj);
coleenp@4037 200 f->do_ptr((void**)&_intArrayKlassObj);
coleenp@4037 201 f->do_ptr((void**)&_shortArrayKlassObj);
coleenp@4037 202 f->do_ptr((void**)&_longArrayKlassObj);
coleenp@4037 203 f->do_ptr((void**)&_singleArrayKlassObj);
coleenp@4037 204 f->do_ptr((void**)&_doubleArrayKlassObj);
coleenp@4037 205 f->do_ptr((void**)&_objectArrayKlassObj);
coleenp@4037 206
coleenp@4037 207 {
coleenp@4037 208 for (int i = 0; i < T_VOID+1; i++) {
coleenp@4037 209 if (_typeArrayKlassObjs[i] != NULL) {
coleenp@4037 210 assert(i >= T_BOOLEAN, "checking");
coleenp@4037 211 f->do_ptr((void**)&_typeArrayKlassObjs[i]);
coleenp@4037 212 } else if (do_all) {
coleenp@4037 213 f->do_ptr((void**)&_typeArrayKlassObjs[i]);
coleenp@4037 214 }
coleenp@4037 215 }
coleenp@4037 216 }
coleenp@4037 217
coleenp@4037 218 f->do_ptr((void**)&_the_array_interfaces_array);
coleenp@4037 219 f->do_ptr((void**)&_the_empty_int_array);
coleenp@4037 220 f->do_ptr((void**)&_the_empty_short_array);
coleenp@4037 221 f->do_ptr((void**)&_the_empty_method_array);
coleenp@4037 222 f->do_ptr((void**)&_the_empty_klass_array);
coleenp@4037 223 _finalizer_register_cache->serialize(f);
coleenp@4062 224 _loader_addClass_cache->serialize(f);
mullan@5242 225 _pd_implies_cache->serialize(f);
coleenp@4037 226 }
duke@435 227
duke@435 228 void Universe::check_alignment(uintx size, uintx alignment, const char* name) {
duke@435 229 if (size < alignment || size % alignment != 0) {
tamao@5191 230 vm_exit_during_initialization(
tamao@5191 231 err_msg("Size of %s (" UINTX_FORMAT " bytes) must be aligned to " UINTX_FORMAT " bytes", name, size, alignment));
duke@435 232 }
duke@435 233 }
duke@435 234
coleenp@4037 235 void initialize_basic_type_klass(Klass* k, TRAPS) {
coleenp@4037 236 Klass* ok = SystemDictionary::Object_klass();
coleenp@4037 237 if (UseSharedSpaces) {
coleenp@4037 238 assert(k->super() == ok, "u3");
coleenp@4037 239 k->restore_unshareable_info(CHECK);
coleenp@4037 240 } else {
coleenp@4037 241 k->initialize_supers(ok, CHECK);
coleenp@4037 242 }
coleenp@4037 243 k->append_to_sibling_list();
coleenp@4037 244 }
duke@435 245
duke@435 246 void Universe::genesis(TRAPS) {
duke@435 247 ResourceMark rm;
coleenp@4037 248
duke@435 249 { FlagSetting fs(_bootstrapping, true);
duke@435 250
duke@435 251 { MutexLocker mc(Compile_lock);
duke@435 252
duke@435 253 // determine base vtable size; without that we cannot create the array klasses
duke@435 254 compute_base_vtable_size();
duke@435 255
duke@435 256 if (!UseSharedSpaces) {
coleenp@4142 257 _boolArrayKlassObj = TypeArrayKlass::create_klass(T_BOOLEAN, sizeof(jboolean), CHECK);
coleenp@4142 258 _charArrayKlassObj = TypeArrayKlass::create_klass(T_CHAR, sizeof(jchar), CHECK);
coleenp@4142 259 _singleArrayKlassObj = TypeArrayKlass::create_klass(T_FLOAT, sizeof(jfloat), CHECK);
coleenp@4142 260 _doubleArrayKlassObj = TypeArrayKlass::create_klass(T_DOUBLE, sizeof(jdouble), CHECK);
coleenp@4142 261 _byteArrayKlassObj = TypeArrayKlass::create_klass(T_BYTE, sizeof(jbyte), CHECK);
coleenp@4142 262 _shortArrayKlassObj = TypeArrayKlass::create_klass(T_SHORT, sizeof(jshort), CHECK);
coleenp@4142 263 _intArrayKlassObj = TypeArrayKlass::create_klass(T_INT, sizeof(jint), CHECK);
coleenp@4142 264 _longArrayKlassObj = TypeArrayKlass::create_klass(T_LONG, sizeof(jlong), CHECK);
duke@435 265
duke@435 266 _typeArrayKlassObjs[T_BOOLEAN] = _boolArrayKlassObj;
duke@435 267 _typeArrayKlassObjs[T_CHAR] = _charArrayKlassObj;
duke@435 268 _typeArrayKlassObjs[T_FLOAT] = _singleArrayKlassObj;
duke@435 269 _typeArrayKlassObjs[T_DOUBLE] = _doubleArrayKlassObj;
duke@435 270 _typeArrayKlassObjs[T_BYTE] = _byteArrayKlassObj;
duke@435 271 _typeArrayKlassObjs[T_SHORT] = _shortArrayKlassObj;
duke@435 272 _typeArrayKlassObjs[T_INT] = _intArrayKlassObj;
duke@435 273 _typeArrayKlassObjs[T_LONG] = _longArrayKlassObj;
duke@435 274
coleenp@4037 275 ClassLoaderData* null_cld = ClassLoaderData::the_null_class_loader_data();
duke@435 276
coleenp@4037 277 _the_array_interfaces_array = MetadataFactory::new_array<Klass*>(null_cld, 2, NULL, CHECK);
coleenp@4037 278 _the_empty_int_array = MetadataFactory::new_array<int>(null_cld, 0, CHECK);
coleenp@4037 279 _the_empty_short_array = MetadataFactory::new_array<u2>(null_cld, 0, CHECK);
coleenp@4037 280 _the_empty_method_array = MetadataFactory::new_array<Method*>(null_cld, 0, CHECK);
coleenp@4037 281 _the_empty_klass_array = MetadataFactory::new_array<Klass*>(null_cld, 0, CHECK);
duke@435 282 }
duke@435 283 }
duke@435 284
duke@435 285 vmSymbols::initialize(CHECK);
duke@435 286
duke@435 287 SystemDictionary::initialize(CHECK);
duke@435 288
coleenp@4037 289 Klass* ok = SystemDictionary::Object_klass();
duke@435 290
never@1515 291 _the_null_string = StringTable::intern("null", CHECK);
never@1515 292 _the_min_jint_string = StringTable::intern("-2147483648", CHECK);
never@1515 293
duke@435 294 if (UseSharedSpaces) {
duke@435 295 // Verify shared interfaces array.
coleenp@4037 296 assert(_the_array_interfaces_array->at(0) ==
never@1577 297 SystemDictionary::Cloneable_klass(), "u3");
coleenp@4037 298 assert(_the_array_interfaces_array->at(1) ==
never@1577 299 SystemDictionary::Serializable_klass(), "u3");
duke@435 300 } else {
duke@435 301 // Set up shared interfaces array. (Do this before supers are set up.)
coleenp@4037 302 _the_array_interfaces_array->at_put(0, SystemDictionary::Cloneable_klass());
coleenp@4037 303 _the_array_interfaces_array->at_put(1, SystemDictionary::Serializable_klass());
duke@435 304 }
duke@435 305
coleenp@4037 306 initialize_basic_type_klass(boolArrayKlassObj(), CHECK);
coleenp@4037 307 initialize_basic_type_klass(charArrayKlassObj(), CHECK);
coleenp@4037 308 initialize_basic_type_klass(singleArrayKlassObj(), CHECK);
coleenp@4037 309 initialize_basic_type_klass(doubleArrayKlassObj(), CHECK);
coleenp@4037 310 initialize_basic_type_klass(byteArrayKlassObj(), CHECK);
coleenp@4037 311 initialize_basic_type_klass(shortArrayKlassObj(), CHECK);
coleenp@4037 312 initialize_basic_type_klass(intArrayKlassObj(), CHECK);
coleenp@4037 313 initialize_basic_type_klass(longArrayKlassObj(), CHECK);
duke@435 314 } // end of core bootstrapping
duke@435 315
coleenp@4037 316 // Maybe this could be lifted up now that object array can be initialized
coleenp@4037 317 // during the bootstrapping.
coleenp@4037 318
coleenp@4037 319 // OLD
duke@435 320 // Initialize _objectArrayKlass after core bootstraping to make
duke@435 321 // sure the super class is set up properly for _objectArrayKlass.
coleenp@4037 322 // ---
coleenp@4037 323 // NEW
coleenp@4037 324 // Since some of the old system object arrays have been converted to
coleenp@4037 325 // ordinary object arrays, _objectArrayKlass will be loaded when
coleenp@4037 326 // SystemDictionary::initialize(CHECK); is run. See the extra check
coleenp@4037 327 // for Object_klass_loaded in objArrayKlassKlass::allocate_objArray_klass_impl.
coleenp@4037 328 _objectArrayKlassObj = InstanceKlass::
never@1577 329 cast(SystemDictionary::Object_klass())->array_klass(1, CHECK);
coleenp@4037 330 // OLD
duke@435 331 // Add the class to the class hierarchy manually to make sure that
duke@435 332 // its vtable is initialized after core bootstrapping is completed.
coleenp@4037 333 // ---
coleenp@4037 334 // New
coleenp@4037 335 // Have already been initialized.
hseigel@4278 336 _objectArrayKlassObj->append_to_sibling_list();
duke@435 337
duke@435 338 // Compute is_jdk version flags.
duke@435 339 // Only 1.3 or later has the java.lang.Shutdown class.
duke@435 340 // Only 1.4 or later has the java.lang.CharSequence interface.
duke@435 341 // Only 1.5 or later has the java.lang.management.MemoryUsage class.
kamg@677 342 if (JDK_Version::is_partially_initialized()) {
kamg@677 343 uint8_t jdk_version;
coleenp@4037 344 Klass* k = SystemDictionary::resolve_or_null(
coleenp@2497 345 vmSymbols::java_lang_management_MemoryUsage(), THREAD);
duke@435 346 CLEAR_PENDING_EXCEPTION; // ignore exceptions
duke@435 347 if (k == NULL) {
kamg@677 348 k = SystemDictionary::resolve_or_null(
coleenp@2497 349 vmSymbols::java_lang_CharSequence(), THREAD);
duke@435 350 CLEAR_PENDING_EXCEPTION; // ignore exceptions
duke@435 351 if (k == NULL) {
kamg@677 352 k = SystemDictionary::resolve_or_null(
coleenp@2497 353 vmSymbols::java_lang_Shutdown(), THREAD);
duke@435 354 CLEAR_PENDING_EXCEPTION; // ignore exceptions
duke@435 355 if (k == NULL) {
kamg@677 356 jdk_version = 2;
duke@435 357 } else {
kamg@677 358 jdk_version = 3;
duke@435 359 }
duke@435 360 } else {
kamg@677 361 jdk_version = 4;
duke@435 362 }
duke@435 363 } else {
kamg@677 364 jdk_version = 5;
duke@435 365 }
kamg@677 366 JDK_Version::fully_initialize(jdk_version);
duke@435 367 }
duke@435 368
duke@435 369 #ifdef ASSERT
duke@435 370 if (FullGCALot) {
duke@435 371 // Allocate an array of dummy objects.
duke@435 372 // We'd like these to be at the bottom of the old generation,
duke@435 373 // so that when we free one and then collect,
duke@435 374 // (almost) the whole heap moves
duke@435 375 // and we find out if we actually update all the oops correctly.
duke@435 376 // But we can't allocate directly in the old generation,
duke@435 377 // so we allocate wherever, and hope that the first collection
duke@435 378 // moves these objects to the bottom of the old generation.
duke@435 379 // We can allocate directly in the permanent generation, so we do.
duke@435 380 int size;
duke@435 381 if (UseConcMarkSweepGC) {
duke@435 382 warning("Using +FullGCALot with concurrent mark sweep gc "
duke@435 383 "will not force all objects to relocate");
duke@435 384 size = FullGCALotDummies;
duke@435 385 } else {
duke@435 386 size = FullGCALotDummies * 2;
duke@435 387 }
coleenp@4037 388 objArrayOop naked_array = oopFactory::new_objArray(SystemDictionary::Object_klass(), size, CHECK);
duke@435 389 objArrayHandle dummy_array(THREAD, naked_array);
duke@435 390 int i = 0;
duke@435 391 while (i < size) {
duke@435 392 // Allocate dummy in old generation
coleenp@4037 393 oop dummy = InstanceKlass::cast(SystemDictionary::Object_klass())->allocate_instance(CHECK);
duke@435 394 dummy_array->obj_at_put(i++, dummy);
duke@435 395 }
duke@435 396 {
duke@435 397 // Only modify the global variable inside the mutex.
duke@435 398 // If we had a race to here, the other dummy_array instances
duke@435 399 // and their elements just get dropped on the floor, which is fine.
duke@435 400 MutexLocker ml(FullGCALot_lock);
duke@435 401 if (_fullgc_alot_dummy_array == NULL) {
duke@435 402 _fullgc_alot_dummy_array = dummy_array();
duke@435 403 }
duke@435 404 }
duke@435 405 assert(i == _fullgc_alot_dummy_array->length(), "just checking");
duke@435 406 }
duke@435 407 #endif
coleenp@4304 408
coleenp@4304 409 // Initialize dependency array for null class loader
coleenp@4304 410 ClassLoaderData::the_null_class_loader_data()->init_dependencies(CHECK);
coleenp@4304 411
duke@435 412 }
duke@435 413
coleenp@4037 414 // CDS support for patching vtables in metadata in the shared archive.
coleenp@4037 415 // All types inherited from Metadata have vtables, but not types inherited
coleenp@4037 416 // from MetaspaceObj, because the latter does not have virtual functions.
coleenp@4037 417 // If the metadata type has a vtable, it cannot be shared in the read-only
coleenp@4037 418 // section of the CDS archive, because the vtable pointer is patched.
coleenp@2497 419 static inline void add_vtable(void** list, int* n, void* o, int count) {
coleenp@2497 420 guarantee((*n) < count, "vtable list too small");
coleenp@4295 421 void* vtable = dereference_vptr(o);
coleenp@4295 422 assert(*(void**)(vtable) != NULL, "invalid vtable");
coleenp@2497 423 list[(*n)++] = vtable;
coleenp@2497 424 }
duke@435 425
duke@435 426 void Universe::init_self_patching_vtbl_list(void** list, int count) {
duke@435 427 int n = 0;
coleenp@4037 428 { InstanceKlass o; add_vtable(list, &n, &o, count); }
coleenp@4047 429 { InstanceClassLoaderKlass o; add_vtable(list, &n, &o, count); }
coleenp@4047 430 { InstanceMirrorKlass o; add_vtable(list, &n, &o, count); }
coleenp@4047 431 { InstanceRefKlass o; add_vtable(list, &n, &o, count); }
coleenp@4142 432 { TypeArrayKlass o; add_vtable(list, &n, &o, count); }
coleenp@4142 433 { ObjArrayKlass o; add_vtable(list, &n, &o, count); }
coleenp@4037 434 { Method o; add_vtable(list, &n, &o, count); }
coleenp@4037 435 { ConstantPool o; add_vtable(list, &n, &o, count); }
duke@435 436 }
duke@435 437
duke@435 438 void Universe::initialize_basic_type_mirrors(TRAPS) {
duke@435 439 assert(_int_mirror==NULL, "basic type mirrors already initialized");
duke@435 440 _int_mirror =
duke@435 441 java_lang_Class::create_basic_type_mirror("int", T_INT, CHECK);
duke@435 442 _float_mirror =
duke@435 443 java_lang_Class::create_basic_type_mirror("float", T_FLOAT, CHECK);
duke@435 444 _double_mirror =
duke@435 445 java_lang_Class::create_basic_type_mirror("double", T_DOUBLE, CHECK);
duke@435 446 _byte_mirror =
duke@435 447 java_lang_Class::create_basic_type_mirror("byte", T_BYTE, CHECK);
duke@435 448 _bool_mirror =
duke@435 449 java_lang_Class::create_basic_type_mirror("boolean",T_BOOLEAN, CHECK);
duke@435 450 _char_mirror =
duke@435 451 java_lang_Class::create_basic_type_mirror("char", T_CHAR, CHECK);
duke@435 452 _long_mirror =
duke@435 453 java_lang_Class::create_basic_type_mirror("long", T_LONG, CHECK);
duke@435 454 _short_mirror =
duke@435 455 java_lang_Class::create_basic_type_mirror("short", T_SHORT, CHECK);
duke@435 456 _void_mirror =
duke@435 457 java_lang_Class::create_basic_type_mirror("void", T_VOID, CHECK);
duke@435 458
duke@435 459 _mirrors[T_INT] = _int_mirror;
duke@435 460 _mirrors[T_FLOAT] = _float_mirror;
duke@435 461 _mirrors[T_DOUBLE] = _double_mirror;
duke@435 462 _mirrors[T_BYTE] = _byte_mirror;
duke@435 463 _mirrors[T_BOOLEAN] = _bool_mirror;
duke@435 464 _mirrors[T_CHAR] = _char_mirror;
duke@435 465 _mirrors[T_LONG] = _long_mirror;
duke@435 466 _mirrors[T_SHORT] = _short_mirror;
duke@435 467 _mirrors[T_VOID] = _void_mirror;
coleenp@4037 468 //_mirrors[T_OBJECT] = InstanceKlass::cast(_object_klass)->java_mirror();
coleenp@4037 469 //_mirrors[T_ARRAY] = InstanceKlass::cast(_object_klass)->java_mirror();
duke@435 470 }
duke@435 471
duke@435 472 void Universe::fixup_mirrors(TRAPS) {
duke@435 473 // Bootstrap problem: all classes gets a mirror (java.lang.Class instance) assigned eagerly,
duke@435 474 // but we cannot do that for classes created before java.lang.Class is loaded. Here we simply
duke@435 475 // walk over permanent objects created so far (mostly classes) and fixup their mirrors. Note
duke@435 476 // that the number of objects allocated at this point is very small.
never@1577 477 assert(SystemDictionary::Class_klass_loaded(), "java.lang.Class should be loaded");
coleenp@4037 478 HandleMark hm(THREAD);
never@2658 479 // Cache the start of the static fields
coleenp@4047 480 InstanceMirrorKlass::init_offset_of_static_fields();
never@2658 481
coleenp@4037 482 GrowableArray <Klass*>* list = java_lang_Class::fixup_mirror_list();
coleenp@4037 483 int list_length = list->length();
coleenp@4037 484 for (int i = 0; i < list_length; i++) {
coleenp@4037 485 Klass* k = list->at(i);
coleenp@4037 486 assert(k->is_klass(), "List should only hold classes");
coleenp@4037 487 EXCEPTION_MARK;
coleenp@4037 488 KlassHandle kh(THREAD, k);
coleenp@4037 489 java_lang_Class::fixup_mirror(kh, CATCH);
duke@435 490 }
coleenp@4037 491 delete java_lang_Class::fixup_mirror_list();
coleenp@4037 492 java_lang_Class::set_fixup_mirror_list(NULL);
coleenp@4037 493 }
duke@435 494
duke@435 495 static bool has_run_finalizers_on_exit = false;
duke@435 496
duke@435 497 void Universe::run_finalizers_on_exit() {
duke@435 498 if (has_run_finalizers_on_exit) return;
duke@435 499 has_run_finalizers_on_exit = true;
duke@435 500
duke@435 501 // Called on VM exit. This ought to be run in a separate thread.
duke@435 502 if (TraceReferenceGC) tty->print_cr("Callback to run finalizers on exit");
duke@435 503 {
duke@435 504 PRESERVE_EXCEPTION_MARK;
never@1577 505 KlassHandle finalizer_klass(THREAD, SystemDictionary::Finalizer_klass());
duke@435 506 JavaValue result(T_VOID);
duke@435 507 JavaCalls::call_static(
duke@435 508 &result,
duke@435 509 finalizer_klass,
coleenp@2497 510 vmSymbols::run_finalizers_on_exit_name(),
coleenp@2497 511 vmSymbols::void_method_signature(),
duke@435 512 THREAD
duke@435 513 );
duke@435 514 // Ignore any pending exceptions
duke@435 515 CLEAR_PENDING_EXCEPTION;
duke@435 516 }
duke@435 517 }
duke@435 518
duke@435 519
duke@435 520 // initialize_vtable could cause gc if
duke@435 521 // 1) we specified true to initialize_vtable and
duke@435 522 // 2) this ran after gc was enabled
duke@435 523 // In case those ever change we use handles for oops
duke@435 524 void Universe::reinitialize_vtable_of(KlassHandle k_h, TRAPS) {
duke@435 525 // init vtable of k and all subclasses
coleenp@4037 526 Klass* ko = k_h();
duke@435 527 klassVtable* vt = ko->vtable();
duke@435 528 if (vt) vt->initialize_vtable(false, CHECK);
duke@435 529 if (ko->oop_is_instance()) {
coleenp@4037 530 InstanceKlass* ik = (InstanceKlass*)ko;
ccheung@5259 531 for (KlassHandle s_h(THREAD, ik->subklass());
ccheung@5259 532 s_h() != NULL;
ccheung@5259 533 s_h = KlassHandle(THREAD, s_h()->next_sibling())) {
duke@435 534 reinitialize_vtable_of(s_h, CHECK);
duke@435 535 }
duke@435 536 }
duke@435 537 }
duke@435 538
duke@435 539
coleenp@4037 540 void initialize_itable_for_klass(Klass* k, TRAPS) {
coleenp@4037 541 InstanceKlass::cast(k)->itable()->initialize_itable(false, CHECK);
duke@435 542 }
duke@435 543
duke@435 544
duke@435 545 void Universe::reinitialize_itables(TRAPS) {
duke@435 546 SystemDictionary::classes_do(initialize_itable_for_klass, CHECK);
duke@435 547
duke@435 548 }
duke@435 549
duke@435 550
duke@435 551 bool Universe::on_page_boundary(void* addr) {
duke@435 552 return ((uintptr_t) addr) % os::vm_page_size() == 0;
duke@435 553 }
duke@435 554
duke@435 555
duke@435 556 bool Universe::should_fill_in_stack_trace(Handle throwable) {
duke@435 557 // never attempt to fill in the stack trace of preallocated errors that do not have
duke@435 558 // backtrace. These errors are kept alive forever and may be "re-used" when all
duke@435 559 // preallocated errors with backtrace have been consumed. Also need to avoid
duke@435 560 // a potential loop which could happen if an out of memory occurs when attempting
duke@435 561 // to allocate the backtrace.
duke@435 562 return ((throwable() != Universe::_out_of_memory_error_java_heap) &&
coleenp@5337 563 (throwable() != Universe::_out_of_memory_error_metaspace) &&
coleenp@5337 564 (throwable() != Universe::_out_of_memory_error_class_metaspace) &&
duke@435 565 (throwable() != Universe::_out_of_memory_error_array_size) &&
duke@435 566 (throwable() != Universe::_out_of_memory_error_gc_overhead_limit));
duke@435 567 }
duke@435 568
duke@435 569
duke@435 570 oop Universe::gen_out_of_memory_error(oop default_err) {
duke@435 571 // generate an out of memory error:
duke@435 572 // - if there is a preallocated error with backtrace available then return it wth
duke@435 573 // a filled in stack trace.
duke@435 574 // - if there are no preallocated errors with backtrace available then return
duke@435 575 // an error without backtrace.
duke@435 576 int next;
duke@435 577 if (_preallocated_out_of_memory_error_avail_count > 0) {
duke@435 578 next = (int)Atomic::add(-1, &_preallocated_out_of_memory_error_avail_count);
duke@435 579 assert(next < (int)PreallocatedOutOfMemoryErrorCount, "avail count is corrupt");
duke@435 580 } else {
duke@435 581 next = -1;
duke@435 582 }
duke@435 583 if (next < 0) {
duke@435 584 // all preallocated errors have been used.
duke@435 585 // return default
duke@435 586 return default_err;
duke@435 587 } else {
duke@435 588 // get the error object at the slot and set set it to NULL so that the
duke@435 589 // array isn't keeping it alive anymore.
duke@435 590 oop exc = preallocated_out_of_memory_errors()->obj_at(next);
duke@435 591 assert(exc != NULL, "slot has been used already");
duke@435 592 preallocated_out_of_memory_errors()->obj_at_put(next, NULL);
duke@435 593
duke@435 594 // use the message from the default error
duke@435 595 oop msg = java_lang_Throwable::message(default_err);
duke@435 596 assert(msg != NULL, "no message");
duke@435 597 java_lang_Throwable::set_message(exc, msg);
duke@435 598
duke@435 599 // populate the stack trace and return it.
duke@435 600 java_lang_Throwable::fill_in_stack_trace_of_preallocated_backtrace(exc);
duke@435 601 return exc;
duke@435 602 }
duke@435 603 }
duke@435 604
duke@435 605 static intptr_t non_oop_bits = 0;
duke@435 606
duke@435 607 void* Universe::non_oop_word() {
duke@435 608 // Neither the high bits nor the low bits of this value is allowed
duke@435 609 // to look like (respectively) the high or low bits of a real oop.
duke@435 610 //
duke@435 611 // High and low are CPU-specific notions, but low always includes
duke@435 612 // the low-order bit. Since oops are always aligned at least mod 4,
duke@435 613 // setting the low-order bit will ensure that the low half of the
duke@435 614 // word will never look like that of a real oop.
duke@435 615 //
duke@435 616 // Using the OS-supplied non-memory-address word (usually 0 or -1)
duke@435 617 // will take care of the high bits, however many there are.
duke@435 618
duke@435 619 if (non_oop_bits == 0) {
duke@435 620 non_oop_bits = (intptr_t)os::non_memory_address_word() | 1;
duke@435 621 }
duke@435 622
duke@435 623 return (void*)non_oop_bits;
duke@435 624 }
duke@435 625
duke@435 626 jint universe_init() {
duke@435 627 assert(!Universe::_fully_initialized, "called after initialize_vtables");
duke@435 628 guarantee(1 << LogHeapWordSize == sizeof(HeapWord),
duke@435 629 "LogHeapWordSize is incorrect.");
duke@435 630 guarantee(sizeof(oop) >= sizeof(HeapWord), "HeapWord larger than oop?");
duke@435 631 guarantee(sizeof(oop) % sizeof(HeapWord) == 0,
coleenp@548 632 "oop size is not not a multiple of HeapWord size");
duke@435 633 TraceTime timer("Genesis", TraceStartupTime);
duke@435 634 GC_locker::lock(); // do not allow gc during bootstrapping
duke@435 635 JavaClasses::compute_hard_coded_offsets();
duke@435 636
duke@435 637 jint status = Universe::initialize_heap();
duke@435 638 if (status != JNI_OK) {
duke@435 639 return status;
duke@435 640 }
duke@435 641
hseigel@5528 642 Metaspace::global_initialize();
hseigel@5528 643
coleenp@4037 644 // Create memory for metadata. Must be after initializing heap for
coleenp@4037 645 // DumpSharedSpaces.
coleenp@4037 646 ClassLoaderData::init_null_class_loader_data();
coleenp@4037 647
coleenp@4037 648 // We have a heap so create the Method* caches before
coleenp@4037 649 // Metaspace::initialize_shared_spaces() tries to populate them.
coleenp@5508 650 Universe::_finalizer_register_cache = new LatestMethodCache();
coleenp@5508 651 Universe::_loader_addClass_cache = new LatestMethodCache();
coleenp@5508 652 Universe::_pd_implies_cache = new LatestMethodCache();
duke@435 653
duke@435 654 if (UseSharedSpaces) {
duke@435 655 // Read the data structures supporting the shared spaces (shared
duke@435 656 // system dictionary, symbol table, etc.). After that, access to
duke@435 657 // the file (other than the mapped regions) is no longer needed, and
duke@435 658 // the file is closed. Closing the file does not affect the
duke@435 659 // currently mapped regions.
coleenp@4037 660 MetaspaceShared::initialize_shared_spaces();
coleenp@4037 661 StringTable::create_table();
duke@435 662 } else {
duke@435 663 SymbolTable::create_table();
duke@435 664 StringTable::create_table();
duke@435 665 ClassLoader::create_package_info_table();
duke@435 666 }
duke@435 667
duke@435 668 return JNI_OK;
duke@435 669 }
duke@435 670
kvn@1077 671 // Choose the heap base address and oop encoding mode
kvn@1077 672 // when compressed oops are used:
kvn@1077 673 // Unscaled - Use 32-bits oops without encoding when
kvn@1077 674 // NarrowOopHeapBaseMin + heap_size < 4Gb
kvn@1077 675 // ZeroBased - Use zero based compressed oops with encoding when
kvn@1077 676 // NarrowOopHeapBaseMin + heap_size < 32Gb
kvn@1077 677 // HeapBased - Use compressed oops with heap base + encoding.
kvn@1077 678
kvn@1077 679 // 4Gb
kvn@1077 680 static const uint64_t NarrowOopHeapMax = (uint64_t(max_juint) + 1);
kvn@1077 681 // 32Gb
kvn@1926 682 // OopEncodingHeapMax == NarrowOopHeapMax << LogMinObjAlignmentInBytes;
kvn@1077 683
stefank@5578 684 char* Universe::preferred_heap_base(size_t heap_size, size_t alignment, NARROW_OOP_MODE mode) {
stefank@5578 685 assert(is_size_aligned((size_t)OopEncodingHeapMax, alignment), "Must be");
stefank@5578 686 assert(is_size_aligned((size_t)NarrowOopHeapMax, alignment), "Must be");
stefank@5578 687 assert(is_size_aligned(heap_size, alignment), "Must be");
stefank@5578 688
stefank@5578 689 uintx heap_base_min_address_aligned = align_size_up(HeapBaseMinAddress, alignment);
stefank@5578 690
kvn@1492 691 size_t base = 0;
kvn@1077 692 #ifdef _LP64
kvn@1077 693 if (UseCompressedOops) {
kvn@1077 694 assert(mode == UnscaledNarrowOop ||
kvn@1077 695 mode == ZeroBasedNarrowOop ||
kvn@1077 696 mode == HeapBasedNarrowOop, "mode is invalid");
stefank@5578 697 const size_t total_size = heap_size + heap_base_min_address_aligned;
kvn@1357 698 // Return specified base for the first request.
kvn@1357 699 if (!FLAG_IS_DEFAULT(HeapBaseMinAddress) && (mode == UnscaledNarrowOop)) {
stefank@5578 700 base = heap_base_min_address_aligned;
hseigel@4523 701
hseigel@5528 702 // If the total size is small enough to allow UnscaledNarrowOop then
hseigel@5528 703 // just use UnscaledNarrowOop.
hseigel@5528 704 } else if ((total_size <= OopEncodingHeapMax) && (mode != HeapBasedNarrowOop)) {
hseigel@4523 705 if ((total_size <= NarrowOopHeapMax) && (mode == UnscaledNarrowOop) &&
kvn@1077 706 (Universe::narrow_oop_shift() == 0)) {
kvn@1077 707 // Use 32-bits oops without encoding and
kvn@1077 708 // place heap's top on the 4Gb boundary
kvn@1492 709 base = (NarrowOopHeapMax - heap_size);
kvn@1077 710 } else {
kvn@1077 711 // Can't reserve with NarrowOopShift == 0
kvn@1077 712 Universe::set_narrow_oop_shift(LogMinObjAlignmentInBytes);
kvn@1077 713 if (mode == UnscaledNarrowOop ||
kvn@1077 714 mode == ZeroBasedNarrowOop && total_size <= NarrowOopHeapMax) {
kvn@1077 715 // Use zero based compressed oops with encoding and
kvn@1077 716 // place heap's top on the 32Gb boundary in case
kvn@1077 717 // total_size > 4Gb or failed to reserve below 4Gb.
kvn@1492 718 base = (OopEncodingHeapMax - heap_size);
kvn@1077 719 }
kvn@1077 720 }
kvn@1077 721 } else {
hseigel@4523 722 // UnscaledNarrowOop encoding didn't work, and no base was found for ZeroBasedOops or
hseigel@4523 723 // HeapBasedNarrowOop encoding was requested. So, can't reserve below 32Gb.
kvn@1077 724 Universe::set_narrow_oop_shift(LogMinObjAlignmentInBytes);
kvn@1077 725 }
hseigel@4523 726
kvn@1492 727 // Set narrow_oop_base and narrow_oop_use_implicit_null_checks
kvn@1492 728 // used in ReservedHeapSpace() constructors.
kvn@1492 729 // The final values will be set in initialize_heap() below.
hseigel@5528 730 if ((base != 0) && ((base + heap_size) <= OopEncodingHeapMax)) {
kvn@1492 731 // Use zero based compressed oops
kvn@1492 732 Universe::set_narrow_oop_base(NULL);
kvn@1492 733 // Don't need guard page for implicit checks in indexed
kvn@1492 734 // addressing mode with zero based Compressed Oops.
kvn@1492 735 Universe::set_narrow_oop_use_implicit_null_checks(true);
kvn@1492 736 } else {
kvn@1492 737 // Set to a non-NULL value so the ReservedSpace ctor computes
kvn@1492 738 // the correct no-access prefix.
kvn@1492 739 // The final value will be set in initialize_heap() below.
kvn@1492 740 Universe::set_narrow_oop_base((address)NarrowOopHeapMax);
kvn@1492 741 #ifdef _WIN64
kvn@1492 742 if (UseLargePages) {
kvn@1492 743 // Cannot allocate guard pages for implicit checks in indexed
kvn@1492 744 // addressing mode when large pages are specified on windows.
kvn@1492 745 Universe::set_narrow_oop_use_implicit_null_checks(false);
kvn@1492 746 }
kvn@1492 747 #endif // _WIN64
kvn@1492 748 }
kvn@1077 749 }
kvn@1077 750 #endif
stefank@5578 751
stefank@5578 752 assert(is_ptr_aligned((char*)base, alignment), "Must be");
kvn@1492 753 return (char*)base; // also return NULL (don't care) for 32-bit VM
kvn@1077 754 }
kvn@1077 755
duke@435 756 jint Universe::initialize_heap() {
duke@435 757
duke@435 758 if (UseParallelGC) {
jprovino@4542 759 #if INCLUDE_ALL_GCS
duke@435 760 Universe::_collectedHeap = new ParallelScavengeHeap();
jprovino@4542 761 #else // INCLUDE_ALL_GCS
jprovino@4165 762 fatal("UseParallelGC not supported in this VM.");
jprovino@4542 763 #endif // INCLUDE_ALL_GCS
duke@435 764
ysr@777 765 } else if (UseG1GC) {
jprovino@4542 766 #if INCLUDE_ALL_GCS
tonyp@3209 767 G1CollectorPolicy* g1p = new G1CollectorPolicy();
ysr@777 768 G1CollectedHeap* g1h = new G1CollectedHeap(g1p);
ysr@777 769 Universe::_collectedHeap = g1h;
jprovino@4542 770 #else // INCLUDE_ALL_GCS
ysr@777 771 fatal("UseG1GC not supported in java kernel vm.");
jprovino@4542 772 #endif // INCLUDE_ALL_GCS
ysr@777 773
duke@435 774 } else {
duke@435 775 GenCollectorPolicy *gc_policy;
duke@435 776
duke@435 777 if (UseSerialGC) {
duke@435 778 gc_policy = new MarkSweepPolicy();
duke@435 779 } else if (UseConcMarkSweepGC) {
jprovino@4542 780 #if INCLUDE_ALL_GCS
duke@435 781 if (UseAdaptiveSizePolicy) {
duke@435 782 gc_policy = new ASConcurrentMarkSweepPolicy();
duke@435 783 } else {
duke@435 784 gc_policy = new ConcurrentMarkSweepPolicy();
duke@435 785 }
jprovino@4542 786 #else // INCLUDE_ALL_GCS
jprovino@4165 787 fatal("UseConcMarkSweepGC not supported in this VM.");
jprovino@4542 788 #endif // INCLUDE_ALL_GCS
duke@435 789 } else { // default old generation
duke@435 790 gc_policy = new MarkSweepPolicy();
duke@435 791 }
duke@435 792
duke@435 793 Universe::_collectedHeap = new GenCollectedHeap(gc_policy);
duke@435 794 }
duke@435 795
duke@435 796 jint status = Universe::heap()->initialize();
duke@435 797 if (status != JNI_OK) {
duke@435 798 return status;
duke@435 799 }
kvn@1077 800
kvn@1077 801 #ifdef _LP64
coleenp@548 802 if (UseCompressedOops) {
coleenp@548 803 // Subtract a page because something can get allocated at heap base.
coleenp@548 804 // This also makes implicit null checking work, because the
coleenp@548 805 // memory+1 page below heap_base needs to cause a signal.
coleenp@548 806 // See needs_explicit_null_check.
coleenp@548 807 // Only set the heap base for compressed oops because it indicates
coleenp@548 808 // compressed oops for pstack code.
kvn@2403 809 bool verbose = PrintCompressedOopsMode || (PrintMiscellaneous && Verbose);
kvn@2403 810 if (verbose) {
kvn@1077 811 tty->cr();
kvn@2305 812 tty->print("heap address: " PTR_FORMAT ", size: " SIZE_FORMAT " MB",
kvn@2305 813 Universe::heap()->base(), Universe::heap()->reserved_region().byte_size()/M);
kvn@1077 814 }
hseigel@5528 815 if (((uint64_t)Universe::heap()->reserved_region().end() > OopEncodingHeapMax)) {
kvn@1077 816 // Can't reserve heap below 32Gb.
roland@4159 817 // keep the Universe::narrow_oop_base() set in Universe::reserve_heap()
kvn@1077 818 Universe::set_narrow_oop_shift(LogMinObjAlignmentInBytes);
kvn@2403 819 if (verbose) {
sla@5237 820 tty->print(", %s: "PTR_FORMAT,
sla@5237 821 narrow_oop_mode_to_string(HeapBasedNarrowOop),
sla@5237 822 Universe::narrow_oop_base());
kvn@1077 823 }
kvn@1077 824 } else {
kvn@1077 825 Universe::set_narrow_oop_base(0);
kvn@2403 826 if (verbose) {
sla@5237 827 tty->print(", %s", narrow_oop_mode_to_string(ZeroBasedNarrowOop));
kvn@1077 828 }
kvn@1077 829 #ifdef _WIN64
kvn@1077 830 if (!Universe::narrow_oop_use_implicit_null_checks()) {
kvn@1077 831 // Don't need guard page for implicit checks in indexed addressing
kvn@1077 832 // mode with zero based Compressed Oops.
kvn@1077 833 Universe::set_narrow_oop_use_implicit_null_checks(true);
kvn@1077 834 }
kvn@1077 835 #endif // _WIN64
kvn@1077 836 if((uint64_t)Universe::heap()->reserved_region().end() > NarrowOopHeapMax) {
kvn@1077 837 // Can't reserve heap below 4Gb.
kvn@1077 838 Universe::set_narrow_oop_shift(LogMinObjAlignmentInBytes);
kvn@1077 839 } else {
kvn@1357 840 Universe::set_narrow_oop_shift(0);
kvn@2403 841 if (verbose) {
sla@5237 842 tty->print(", %s", narrow_oop_mode_to_string(UnscaledNarrowOop));
kvn@1077 843 }
kvn@1077 844 }
kvn@1077 845 }
hseigel@5528 846
kvn@2403 847 if (verbose) {
kvn@1077 848 tty->cr();
kvn@1077 849 tty->cr();
kvn@1077 850 }
roland@4159 851 Universe::set_narrow_ptrs_base(Universe::narrow_oop_base());
coleenp@548 852 }
hseigel@5528 853 // Universe::narrow_oop_base() is one page below the heap.
hseigel@5528 854 assert((intptr_t)Universe::narrow_oop_base() <= (intptr_t)(Universe::heap()->base() -
hseigel@5528 855 os::vm_page_size()) ||
kvn@1077 856 Universe::narrow_oop_base() == NULL, "invalid value");
kvn@1077 857 assert(Universe::narrow_oop_shift() == LogMinObjAlignmentInBytes ||
kvn@1077 858 Universe::narrow_oop_shift() == 0, "invalid value");
kvn@1077 859 #endif
duke@435 860
duke@435 861 // We will never reach the CATCH below since Exceptions::_throw will cause
duke@435 862 // the VM to exit if an exception is thrown during initialization
duke@435 863
duke@435 864 if (UseTLAB) {
duke@435 865 assert(Universe::heap()->supports_tlab_allocation(),
duke@435 866 "Should support thread-local allocation buffers");
duke@435 867 ThreadLocalAllocBuffer::startup_initialization();
duke@435 868 }
duke@435 869 return JNI_OK;
duke@435 870 }
duke@435 871
coleenp@4037 872
coleenp@4037 873 // Reserve the Java heap, which is now the same for all GCs.
coleenp@4037 874 ReservedSpace Universe::reserve_heap(size_t heap_size, size_t alignment) {
tschatzl@5701 875 assert(alignment <= Arguments::conservative_max_heap_alignment(),
tschatzl@5701 876 err_msg("actual alignment "SIZE_FORMAT" must be within maximum heap alignment "SIZE_FORMAT,
tschatzl@5701 877 alignment, Arguments::conservative_max_heap_alignment()));
hseigel@5528 878 size_t total_reserved = align_size_up(heap_size, alignment);
brutisso@4741 879 assert(!UseCompressedOops || (total_reserved <= (OopEncodingHeapMax - os::vm_page_size())),
brutisso@4741 880 "heap size is too big for compressed oops");
coleenp@4037 881
stefank@5578 882 bool use_large_pages = UseLargePages && is_size_aligned(alignment, os::large_page_size());
stefank@5578 883 assert(!UseLargePages
stefank@5578 884 || UseParallelOldGC
stefank@5578 885 || use_large_pages, "Wrong alignment to use large pages");
stefank@5578 886
stefank@5578 887 char* addr = Universe::preferred_heap_base(total_reserved, alignment, Universe::UnscaledNarrowOop);
stefank@5578 888
stefank@5578 889 ReservedHeapSpace total_rs(total_reserved, alignment, use_large_pages, addr);
coleenp@4037 890
coleenp@4037 891 if (UseCompressedOops) {
coleenp@4037 892 if (addr != NULL && !total_rs.is_reserved()) {
coleenp@4037 893 // Failed to reserve at specified address - the requested memory
coleenp@4037 894 // region is taken already, for example, by 'java' launcher.
coleenp@4037 895 // Try again to reserver heap higher.
stefank@5578 896 addr = Universe::preferred_heap_base(total_reserved, alignment, Universe::ZeroBasedNarrowOop);
coleenp@4037 897
coleenp@4037 898 ReservedHeapSpace total_rs0(total_reserved, alignment,
stefank@5578 899 use_large_pages, addr);
coleenp@4037 900
coleenp@4037 901 if (addr != NULL && !total_rs0.is_reserved()) {
coleenp@4037 902 // Failed to reserve at specified address again - give up.
stefank@5578 903 addr = Universe::preferred_heap_base(total_reserved, alignment, Universe::HeapBasedNarrowOop);
coleenp@4037 904 assert(addr == NULL, "");
coleenp@4037 905
coleenp@4037 906 ReservedHeapSpace total_rs1(total_reserved, alignment,
stefank@5578 907 use_large_pages, addr);
coleenp@4037 908 total_rs = total_rs1;
coleenp@4037 909 } else {
coleenp@4037 910 total_rs = total_rs0;
coleenp@4037 911 }
coleenp@4037 912 }
coleenp@4037 913 }
coleenp@4037 914
coleenp@4037 915 if (!total_rs.is_reserved()) {
tamao@5191 916 vm_exit_during_initialization(err_msg("Could not reserve enough space for " SIZE_FORMAT "KB object heap", total_reserved/K));
coleenp@4037 917 return total_rs;
coleenp@4037 918 }
coleenp@4037 919
roland@4159 920 if (UseCompressedOops) {
roland@4159 921 // Universe::initialize_heap() will reset this to NULL if unscaled
roland@4159 922 // or zero-based narrow oops are actually used.
roland@4159 923 address base = (address)(total_rs.base() - os::vm_page_size());
roland@4159 924 Universe::set_narrow_oop_base(base);
roland@4159 925 }
hseigel@5528 926 return total_rs;
coleenp@4037 927 }
coleenp@4037 928
coleenp@4037 929
hseigel@5528 930 // It's the caller's responsibility to ensure glitch-freedom
duke@435 931 // (if required).
duke@435 932 void Universe::update_heap_info_at_gc() {
duke@435 933 _heap_capacity_at_last_gc = heap()->capacity();
duke@435 934 _heap_used_at_last_gc = heap()->used();
duke@435 935 }
duke@435 936
duke@435 937
sla@5237 938 const char* Universe::narrow_oop_mode_to_string(Universe::NARROW_OOP_MODE mode) {
sla@5237 939 switch (mode) {
sla@5237 940 case UnscaledNarrowOop:
sla@5237 941 return "32-bits Oops";
sla@5237 942 case ZeroBasedNarrowOop:
sla@5237 943 return "zero based Compressed Oops";
sla@5237 944 case HeapBasedNarrowOop:
sla@5237 945 return "Compressed Oops with base";
sla@5237 946 }
sla@5237 947
sla@5237 948 ShouldNotReachHere();
sla@5237 949 return "";
sla@5237 950 }
sla@5237 951
sla@5237 952
sla@5237 953 Universe::NARROW_OOP_MODE Universe::narrow_oop_mode() {
sla@5237 954 if (narrow_oop_base() != 0) {
sla@5237 955 return HeapBasedNarrowOop;
sla@5237 956 }
sla@5237 957
sla@5237 958 if (narrow_oop_shift() != 0) {
sla@5237 959 return ZeroBasedNarrowOop;
sla@5237 960 }
sla@5237 961
sla@5237 962 return UnscaledNarrowOop;
sla@5237 963 }
sla@5237 964
duke@435 965
duke@435 966 void universe2_init() {
duke@435 967 EXCEPTION_MARK;
duke@435 968 Universe::genesis(CATCH);
duke@435 969 }
duke@435 970
duke@435 971
duke@435 972 // This function is defined in JVM.cpp
duke@435 973 extern void initialize_converter_functions();
duke@435 974
duke@435 975 bool universe_post_init() {
ysr@2301 976 assert(!is_init_completed(), "Error: initialization not yet completed!");
duke@435 977 Universe::_fully_initialized = true;
duke@435 978 EXCEPTION_MARK;
duke@435 979 { ResourceMark rm;
duke@435 980 Interpreter::initialize(); // needed for interpreter entry points
duke@435 981 if (!UseSharedSpaces) {
coleenp@4037 982 HandleMark hm(THREAD);
never@1577 983 KlassHandle ok_h(THREAD, SystemDictionary::Object_klass());
duke@435 984 Universe::reinitialize_vtable_of(ok_h, CHECK_false);
duke@435 985 Universe::reinitialize_itables(CHECK_false);
duke@435 986 }
duke@435 987 }
duke@435 988
coleenp@4037 989 HandleMark hm(THREAD);
coleenp@4037 990 Klass* k;
duke@435 991 instanceKlassHandle k_h;
duke@435 992 // Setup preallocated empty java.lang.Class array
never@1577 993 Universe::_the_empty_class_klass_array = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_false);
coleenp@4037 994
duke@435 995 // Setup preallocated OutOfMemoryError errors
coleenp@2497 996 k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_OutOfMemoryError(), true, CHECK_false);
duke@435 997 k_h = instanceKlassHandle(THREAD, k);
coleenp@4037 998 Universe::_out_of_memory_error_java_heap = k_h->allocate_instance(CHECK_false);
coleenp@5337 999 Universe::_out_of_memory_error_metaspace = k_h->allocate_instance(CHECK_false);
coleenp@5337 1000 Universe::_out_of_memory_error_class_metaspace = k_h->allocate_instance(CHECK_false);
coleenp@4037 1001 Universe::_out_of_memory_error_array_size = k_h->allocate_instance(CHECK_false);
duke@435 1002 Universe::_out_of_memory_error_gc_overhead_limit =
coleenp@4037 1003 k_h->allocate_instance(CHECK_false);
duke@435 1004
duke@435 1005 // Setup preallocated NullPointerException
duke@435 1006 // (this is currently used for a cheap & dirty solution in compiler exception handling)
coleenp@2497 1007 k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_NullPointerException(), true, CHECK_false);
coleenp@4037 1008 Universe::_null_ptr_exception_instance = InstanceKlass::cast(k)->allocate_instance(CHECK_false);
duke@435 1009 // Setup preallocated ArithmeticException
duke@435 1010 // (this is currently used for a cheap & dirty solution in compiler exception handling)
coleenp@2497 1011 k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_ArithmeticException(), true, CHECK_false);
coleenp@4037 1012 Universe::_arithmetic_exception_instance = InstanceKlass::cast(k)->allocate_instance(CHECK_false);
duke@435 1013 // Virtual Machine Error for when we get into a situation we can't resolve
duke@435 1014 k = SystemDictionary::resolve_or_fail(
coleenp@2497 1015 vmSymbols::java_lang_VirtualMachineError(), true, CHECK_false);
coleenp@4037 1016 bool linked = InstanceKlass::cast(k)->link_class_or_fail(CHECK_false);
duke@435 1017 if (!linked) {
duke@435 1018 tty->print_cr("Unable to link/verify VirtualMachineError class");
duke@435 1019 return false; // initialization failed
duke@435 1020 }
duke@435 1021 Universe::_virtual_machine_error_instance =
coleenp@4037 1022 InstanceKlass::cast(k)->allocate_instance(CHECK_false);
coleenp@2497 1023
coleenp@4037 1024 Universe::_vm_exception = InstanceKlass::cast(k)->allocate_instance(CHECK_false);
coleenp@2497 1025
duke@435 1026 if (!DumpSharedSpaces) {
duke@435 1027 // These are the only Java fields that are currently set during shared space dumping.
duke@435 1028 // We prefer to not handle this generally, so we always reinitialize these detail messages.
duke@435 1029 Handle msg = java_lang_String::create_from_str("Java heap space", CHECK_false);
duke@435 1030 java_lang_Throwable::set_message(Universe::_out_of_memory_error_java_heap, msg());
duke@435 1031
coleenp@4037 1032 msg = java_lang_String::create_from_str("Metadata space", CHECK_false);
coleenp@5337 1033 java_lang_Throwable::set_message(Universe::_out_of_memory_error_metaspace, msg());
ehelin@5694 1034 msg = java_lang_String::create_from_str("Compressed class space", CHECK_false);
coleenp@5337 1035 java_lang_Throwable::set_message(Universe::_out_of_memory_error_class_metaspace, msg());
duke@435 1036
duke@435 1037 msg = java_lang_String::create_from_str("Requested array size exceeds VM limit", CHECK_false);
duke@435 1038 java_lang_Throwable::set_message(Universe::_out_of_memory_error_array_size, msg());
duke@435 1039
duke@435 1040 msg = java_lang_String::create_from_str("GC overhead limit exceeded", CHECK_false);
duke@435 1041 java_lang_Throwable::set_message(Universe::_out_of_memory_error_gc_overhead_limit, msg());
duke@435 1042
duke@435 1043 msg = java_lang_String::create_from_str("/ by zero", CHECK_false);
duke@435 1044 java_lang_Throwable::set_message(Universe::_arithmetic_exception_instance, msg());
duke@435 1045
duke@435 1046 // Setup the array of errors that have preallocated backtrace
duke@435 1047 k = Universe::_out_of_memory_error_java_heap->klass();
coleenp@4037 1048 assert(k->name() == vmSymbols::java_lang_OutOfMemoryError(), "should be out of memory error");
duke@435 1049 k_h = instanceKlassHandle(THREAD, k);
duke@435 1050
duke@435 1051 int len = (StackTraceInThrowable) ? (int)PreallocatedOutOfMemoryErrorCount : 0;
duke@435 1052 Universe::_preallocated_out_of_memory_error_array = oopFactory::new_objArray(k_h(), len, CHECK_false);
duke@435 1053 for (int i=0; i<len; i++) {
coleenp@4037 1054 oop err = k_h->allocate_instance(CHECK_false);
duke@435 1055 Handle err_h = Handle(THREAD, err);
duke@435 1056 java_lang_Throwable::allocate_backtrace(err_h, CHECK_false);
duke@435 1057 Universe::preallocated_out_of_memory_errors()->obj_at_put(i, err_h());
duke@435 1058 }
duke@435 1059 Universe::_preallocated_out_of_memory_error_avail_count = (jint)len;
duke@435 1060 }
duke@435 1061
duke@435 1062
duke@435 1063 // Setup static method for registering finalizers
duke@435 1064 // The finalizer klass must be linked before looking up the method, in
duke@435 1065 // case it needs to get rewritten.
coleenp@4037 1066 InstanceKlass::cast(SystemDictionary::Finalizer_klass())->link_class(CHECK_false);
coleenp@4037 1067 Method* m = InstanceKlass::cast(SystemDictionary::Finalizer_klass())->find_method(
duke@435 1068 vmSymbols::register_method_name(),
duke@435 1069 vmSymbols::register_method_signature());
duke@435 1070 if (m == NULL || !m->is_static()) {
coleenp@5508 1071 tty->print_cr("Unable to link/verify Finalizer.register method");
coleenp@5508 1072 return false; // initialization failed (cannot throw exception yet)
duke@435 1073 }
duke@435 1074 Universe::_finalizer_register_cache->init(
coleenp@5508 1075 SystemDictionary::Finalizer_klass(), m);
duke@435 1076
coleenp@4062 1077 // Setup method for registering loaded classes in class loader vector
coleenp@4062 1078 InstanceKlass::cast(SystemDictionary::ClassLoader_klass())->link_class(CHECK_false);
coleenp@4062 1079 m = InstanceKlass::cast(SystemDictionary::ClassLoader_klass())->find_method(vmSymbols::addClass_name(), vmSymbols::class_void_signature());
coleenp@4062 1080 if (m == NULL || m->is_static()) {
coleenp@5508 1081 tty->print_cr("Unable to link/verify ClassLoader.addClass method");
coleenp@5508 1082 return false; // initialization failed (cannot throw exception yet)
coleenp@4062 1083 }
coleenp@4062 1084 Universe::_loader_addClass_cache->init(
coleenp@5508 1085 SystemDictionary::ClassLoader_klass(), m);
coleenp@4062 1086
mullan@5242 1087 // Setup method for checking protection domain
mullan@5242 1088 InstanceKlass::cast(SystemDictionary::ProtectionDomain_klass())->link_class(CHECK_false);
mullan@5242 1089 m = InstanceKlass::cast(SystemDictionary::ProtectionDomain_klass())->
mullan@5242 1090 find_method(vmSymbols::impliesCreateAccessControlContext_name(),
mullan@5242 1091 vmSymbols::void_boolean_signature());
mullan@5242 1092 // Allow NULL which should only happen with bootstrapping.
mullan@5242 1093 if (m != NULL) {
mullan@5242 1094 if (m->is_static()) {
mullan@5242 1095 // NoSuchMethodException doesn't actually work because it tries to run the
mullan@5242 1096 // <init> function before java_lang_Class is linked. Print error and exit.
mullan@5242 1097 tty->print_cr("ProtectionDomain.impliesCreateAccessControlContext() has the wrong linkage");
mullan@5242 1098 return false; // initialization failed
mullan@5242 1099 }
mullan@5242 1100 Universe::_pd_implies_cache->init(
coleenp@5508 1101 SystemDictionary::ProtectionDomain_klass(), m);;
mullan@5242 1102 }
mullan@5242 1103
duke@435 1104 // The folowing is initializing converter functions for serialization in
duke@435 1105 // JVM.cpp. If we clean up the StrictMath code above we may want to find
duke@435 1106 // a better solution for this as well.
duke@435 1107 initialize_converter_functions();
duke@435 1108
duke@435 1109 // This needs to be done before the first scavenge/gc, since
duke@435 1110 // it's an input to soft ref clearing policy.
ysr@777 1111 {
ysr@777 1112 MutexLocker x(Heap_lock);
ysr@777 1113 Universe::update_heap_info_at_gc();
ysr@777 1114 }
duke@435 1115
duke@435 1116 // ("weak") refs processing infrastructure initialization
duke@435 1117 Universe::heap()->post_initialize();
duke@435 1118
coleenp@4037 1119 // Initialize performance counters for metaspaces
coleenp@4037 1120 MetaspaceCounters::initialize_performance_counters();
ehelin@5531 1121 CompressedClassSpaceCounters::initialize_performance_counters();
ehelin@5531 1122
ehelin@5312 1123 MemoryService::add_metaspace_memory_pools();
coleenp@4037 1124
duke@435 1125 GC_locker::unlock(); // allow gc after bootstrapping
duke@435 1126
duke@435 1127 MemoryService::set_universe_heap(Universe::_collectedHeap);
duke@435 1128 return true;
duke@435 1129 }
duke@435 1130
duke@435 1131
duke@435 1132 void Universe::compute_base_vtable_size() {
duke@435 1133 _base_vtable_size = ClassLoader::compute_Object_vtable();
duke@435 1134 }
duke@435 1135
duke@435 1136
duke@435 1137 // %%% The Universe::flush_foo methods belong in CodeCache.
duke@435 1138
duke@435 1139 // Flushes compiled methods dependent on dependee.
duke@435 1140 void Universe::flush_dependents_on(instanceKlassHandle dependee) {
duke@435 1141 assert_lock_strong(Compile_lock);
duke@435 1142
duke@435 1143 if (CodeCache::number_of_nmethods_with_dependencies() == 0) return;
duke@435 1144
duke@435 1145 // CodeCache can only be updated by a thread_in_VM and they will all be
duke@435 1146 // stopped dring the safepoint so CodeCache will be safe to update without
duke@435 1147 // holding the CodeCache_lock.
duke@435 1148
twisti@3050 1149 KlassDepChange changes(dependee);
duke@435 1150
duke@435 1151 // Compute the dependent nmethods
duke@435 1152 if (CodeCache::mark_for_deoptimization(changes) > 0) {
duke@435 1153 // At least one nmethod has been marked for deoptimization
duke@435 1154 VM_Deoptimize op;
duke@435 1155 VMThread::execute(&op);
duke@435 1156 }
duke@435 1157 }
duke@435 1158
twisti@3050 1159 // Flushes compiled methods dependent on a particular CallSite
twisti@3050 1160 // instance when its target is different than the given MethodHandle.
twisti@3050 1161 void Universe::flush_dependents_on(Handle call_site, Handle method_handle) {
twisti@3050 1162 assert_lock_strong(Compile_lock);
twisti@3050 1163
twisti@3050 1164 if (CodeCache::number_of_nmethods_with_dependencies() == 0) return;
twisti@3050 1165
twisti@3050 1166 // CodeCache can only be updated by a thread_in_VM and they will all be
twisti@3050 1167 // stopped dring the safepoint so CodeCache will be safe to update without
twisti@3050 1168 // holding the CodeCache_lock.
twisti@3050 1169
twisti@3050 1170 CallSiteDepChange changes(call_site(), method_handle());
twisti@3050 1171
twisti@3050 1172 // Compute the dependent nmethods that have a reference to a
coleenp@4037 1173 // CallSite object. We use InstanceKlass::mark_dependent_nmethod
twisti@3050 1174 // directly instead of CodeCache::mark_for_deoptimization because we
twisti@3094 1175 // want dependents on the call site class only not all classes in
twisti@3094 1176 // the ContextStream.
twisti@3050 1177 int marked = 0;
twisti@3050 1178 {
twisti@3050 1179 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
coleenp@4037 1180 InstanceKlass* call_site_klass = InstanceKlass::cast(call_site->klass());
twisti@3050 1181 marked = call_site_klass->mark_dependent_nmethods(changes);
twisti@3050 1182 }
twisti@3050 1183 if (marked > 0) {
twisti@3050 1184 // At least one nmethod has been marked for deoptimization
twisti@3050 1185 VM_Deoptimize op;
twisti@3050 1186 VMThread::execute(&op);
twisti@3050 1187 }
twisti@3050 1188 }
twisti@3050 1189
duke@435 1190 #ifdef HOTSWAP
duke@435 1191 // Flushes compiled methods dependent on dependee in the evolutionary sense
duke@435 1192 void Universe::flush_evol_dependents_on(instanceKlassHandle ev_k_h) {
duke@435 1193 // --- Compile_lock is not held. However we are at a safepoint.
duke@435 1194 assert_locked_or_safepoint(Compile_lock);
duke@435 1195 if (CodeCache::number_of_nmethods_with_dependencies() == 0) return;
duke@435 1196
duke@435 1197 // CodeCache can only be updated by a thread_in_VM and they will all be
duke@435 1198 // stopped dring the safepoint so CodeCache will be safe to update without
duke@435 1199 // holding the CodeCache_lock.
duke@435 1200
duke@435 1201 // Compute the dependent nmethods
duke@435 1202 if (CodeCache::mark_for_evol_deoptimization(ev_k_h) > 0) {
duke@435 1203 // At least one nmethod has been marked for deoptimization
duke@435 1204
duke@435 1205 // All this already happens inside a VM_Operation, so we'll do all the work here.
duke@435 1206 // Stuff copied from VM_Deoptimize and modified slightly.
duke@435 1207
duke@435 1208 // We do not want any GCs to happen while we are in the middle of this VM operation
duke@435 1209 ResourceMark rm;
duke@435 1210 DeoptimizationMarker dm;
duke@435 1211
duke@435 1212 // Deoptimize all activations depending on marked nmethods
duke@435 1213 Deoptimization::deoptimize_dependents();
duke@435 1214
duke@435 1215 // Make the dependent methods not entrant (in VM_Deoptimize they are made zombies)
duke@435 1216 CodeCache::make_marked_nmethods_not_entrant();
duke@435 1217 }
duke@435 1218 }
duke@435 1219 #endif // HOTSWAP
duke@435 1220
duke@435 1221
duke@435 1222 // Flushes compiled methods dependent on dependee
duke@435 1223 void Universe::flush_dependents_on_method(methodHandle m_h) {
duke@435 1224 // --- Compile_lock is not held. However we are at a safepoint.
duke@435 1225 assert_locked_or_safepoint(Compile_lock);
duke@435 1226
duke@435 1227 // CodeCache can only be updated by a thread_in_VM and they will all be
duke@435 1228 // stopped dring the safepoint so CodeCache will be safe to update without
duke@435 1229 // holding the CodeCache_lock.
duke@435 1230
duke@435 1231 // Compute the dependent nmethods
duke@435 1232 if (CodeCache::mark_for_deoptimization(m_h()) > 0) {
duke@435 1233 // At least one nmethod has been marked for deoptimization
duke@435 1234
duke@435 1235 // All this already happens inside a VM_Operation, so we'll do all the work here.
duke@435 1236 // Stuff copied from VM_Deoptimize and modified slightly.
duke@435 1237
duke@435 1238 // We do not want any GCs to happen while we are in the middle of this VM operation
duke@435 1239 ResourceMark rm;
duke@435 1240 DeoptimizationMarker dm;
duke@435 1241
duke@435 1242 // Deoptimize all activations depending on marked nmethods
duke@435 1243 Deoptimization::deoptimize_dependents();
duke@435 1244
duke@435 1245 // Make the dependent methods not entrant (in VM_Deoptimize they are made zombies)
duke@435 1246 CodeCache::make_marked_nmethods_not_entrant();
duke@435 1247 }
duke@435 1248 }
duke@435 1249
tonyp@3269 1250 void Universe::print() {
tonyp@3269 1251 print_on(gclog_or_tty);
tonyp@3269 1252 }
duke@435 1253
tonyp@3269 1254 void Universe::print_on(outputStream* st, bool extended) {
duke@435 1255 st->print_cr("Heap");
tonyp@3269 1256 if (!extended) {
tonyp@3269 1257 heap()->print_on(st);
tonyp@3269 1258 } else {
tonyp@3269 1259 heap()->print_extended_on(st);
tonyp@3269 1260 }
duke@435 1261 }
duke@435 1262
duke@435 1263 void Universe::print_heap_at_SIGBREAK() {
duke@435 1264 if (PrintHeapAtSIGBREAK) {
duke@435 1265 MutexLocker hl(Heap_lock);
duke@435 1266 print_on(tty);
duke@435 1267 tty->cr();
duke@435 1268 tty->flush();
duke@435 1269 }
duke@435 1270 }
duke@435 1271
never@3571 1272 void Universe::print_heap_before_gc(outputStream* st, bool ignore_extended) {
duke@435 1273 st->print_cr("{Heap before GC invocations=%u (full %u):",
duke@435 1274 heap()->total_collections(),
duke@435 1275 heap()->total_full_collections());
never@3571 1276 if (!PrintHeapAtGCExtended || ignore_extended) {
tonyp@3269 1277 heap()->print_on(st);
tonyp@3269 1278 } else {
tonyp@3269 1279 heap()->print_extended_on(st);
tonyp@3269 1280 }
duke@435 1281 }
duke@435 1282
never@3571 1283 void Universe::print_heap_after_gc(outputStream* st, bool ignore_extended) {
duke@435 1284 st->print_cr("Heap after GC invocations=%u (full %u):",
duke@435 1285 heap()->total_collections(),
duke@435 1286 heap()->total_full_collections());
never@3571 1287 if (!PrintHeapAtGCExtended || ignore_extended) {
tonyp@3269 1288 heap()->print_on(st);
tonyp@3269 1289 } else {
tonyp@3269 1290 heap()->print_extended_on(st);
tonyp@3269 1291 }
duke@435 1292 st->print_cr("}");
duke@435 1293 }
duke@435 1294
stefank@5018 1295 void Universe::verify(VerifyOption option, const char* prefix, bool silent) {
duke@435 1296 // The use of _verify_in_progress is a temporary work around for
duke@435 1297 // 6320749. Don't bother with a creating a class to set and clear
duke@435 1298 // it since it is only used in this method and the control flow is
duke@435 1299 // straight forward.
duke@435 1300 _verify_in_progress = true;
duke@435 1301
duke@435 1302 COMPILER2_PRESENT(
duke@435 1303 assert(!DerivedPointerTable::is_active(),
duke@435 1304 "DPT should not be active during verification "
duke@435 1305 "(of thread stacks below)");
duke@435 1306 )
duke@435 1307
duke@435 1308 ResourceMark rm;
duke@435 1309 HandleMark hm; // Handles created during verification can be zapped
duke@435 1310 _verify_count++;
duke@435 1311
stefank@5018 1312 if (!silent) gclog_or_tty->print(prefix);
duke@435 1313 if (!silent) gclog_or_tty->print("[Verifying ");
duke@435 1314 if (!silent) gclog_or_tty->print("threads ");
duke@435 1315 Threads::verify();
stefank@5018 1316 if (!silent) gclog_or_tty->print("heap ");
brutisso@3711 1317 heap()->verify(silent, option);
duke@435 1318 if (!silent) gclog_or_tty->print("syms ");
duke@435 1319 SymbolTable::verify();
duke@435 1320 if (!silent) gclog_or_tty->print("strs ");
duke@435 1321 StringTable::verify();
duke@435 1322 {
duke@435 1323 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
duke@435 1324 if (!silent) gclog_or_tty->print("zone ");
duke@435 1325 CodeCache::verify();
duke@435 1326 }
duke@435 1327 if (!silent) gclog_or_tty->print("dict ");
duke@435 1328 SystemDictionary::verify();
coleenp@4037 1329 #ifndef PRODUCT
coleenp@4037 1330 if (!silent) gclog_or_tty->print("cldg ");
coleenp@4037 1331 ClassLoaderDataGraph::verify();
coleenp@4037 1332 #endif
mgerdin@4264 1333 if (!silent) gclog_or_tty->print("metaspace chunks ");
mgerdin@4264 1334 MetaspaceAux::verify_free_chunks();
duke@435 1335 if (!silent) gclog_or_tty->print("hand ");
duke@435 1336 JNIHandles::verify();
duke@435 1337 if (!silent) gclog_or_tty->print("C-heap ");
duke@435 1338 os::check_heap();
never@2657 1339 if (!silent) gclog_or_tty->print("code cache ");
never@2657 1340 CodeCache::verify_oops();
duke@435 1341 if (!silent) gclog_or_tty->print_cr("]");
duke@435 1342
duke@435 1343 _verify_in_progress = false;
duke@435 1344 }
duke@435 1345
duke@435 1346 // Oop verification (see MacroAssembler::verify_oop)
duke@435 1347
duke@435 1348 static uintptr_t _verify_oop_data[2] = {0, (uintptr_t)-1};
duke@435 1349 static uintptr_t _verify_klass_data[2] = {0, (uintptr_t)-1};
duke@435 1350
duke@435 1351
mikael@4889 1352 #ifndef PRODUCT
mikael@4889 1353
duke@435 1354 static void calculate_verify_data(uintptr_t verify_data[2],
duke@435 1355 HeapWord* low_boundary,
duke@435 1356 HeapWord* high_boundary) {
duke@435 1357 assert(low_boundary < high_boundary, "bad interval");
duke@435 1358
duke@435 1359 // decide which low-order bits we require to be clear:
duke@435 1360 size_t alignSize = MinObjAlignmentInBytes;
kvn@1926 1361 size_t min_object_size = CollectedHeap::min_fill_size();
duke@435 1362
duke@435 1363 // make an inclusive limit:
duke@435 1364 uintptr_t max = (uintptr_t)high_boundary - min_object_size*wordSize;
duke@435 1365 uintptr_t min = (uintptr_t)low_boundary;
duke@435 1366 assert(min < max, "bad interval");
duke@435 1367 uintptr_t diff = max ^ min;
duke@435 1368
duke@435 1369 // throw away enough low-order bits to make the diff vanish
duke@435 1370 uintptr_t mask = (uintptr_t)(-1);
duke@435 1371 while ((mask & diff) != 0)
duke@435 1372 mask <<= 1;
duke@435 1373 uintptr_t bits = (min & mask);
duke@435 1374 assert(bits == (max & mask), "correct mask");
duke@435 1375 // check an intermediate value between min and max, just to make sure:
duke@435 1376 assert(bits == ((min + (max-min)/2) & mask), "correct mask");
duke@435 1377
duke@435 1378 // require address alignment, too:
duke@435 1379 mask |= (alignSize - 1);
duke@435 1380
duke@435 1381 if (!(verify_data[0] == 0 && verify_data[1] == (uintptr_t)-1)) {
duke@435 1382 assert(verify_data[0] == mask && verify_data[1] == bits, "mask stability");
duke@435 1383 }
duke@435 1384 verify_data[0] = mask;
duke@435 1385 verify_data[1] = bits;
duke@435 1386 }
duke@435 1387
duke@435 1388 // Oop verification (see MacroAssembler::verify_oop)
duke@435 1389
duke@435 1390 uintptr_t Universe::verify_oop_mask() {
duke@435 1391 MemRegion m = heap()->reserved_region();
duke@435 1392 calculate_verify_data(_verify_oop_data,
duke@435 1393 m.start(),
duke@435 1394 m.end());
duke@435 1395 return _verify_oop_data[0];
duke@435 1396 }
duke@435 1397
duke@435 1398
duke@435 1399
duke@435 1400 uintptr_t Universe::verify_oop_bits() {
duke@435 1401 verify_oop_mask();
duke@435 1402 return _verify_oop_data[1];
duke@435 1403 }
duke@435 1404
duke@435 1405 uintptr_t Universe::verify_mark_mask() {
duke@435 1406 return markOopDesc::lock_mask_in_place;
duke@435 1407 }
duke@435 1408
duke@435 1409 uintptr_t Universe::verify_mark_bits() {
duke@435 1410 intptr_t mask = verify_mark_mask();
duke@435 1411 intptr_t bits = (intptr_t)markOopDesc::prototype();
duke@435 1412 assert((bits & ~mask) == 0, "no stray header bits");
duke@435 1413 return bits;
duke@435 1414 }
duke@435 1415 #endif // PRODUCT
duke@435 1416
duke@435 1417
duke@435 1418 void Universe::compute_verify_oop_data() {
duke@435 1419 verify_oop_mask();
duke@435 1420 verify_oop_bits();
duke@435 1421 verify_mark_mask();
duke@435 1422 verify_mark_bits();
duke@435 1423 }
duke@435 1424
duke@435 1425
coleenp@5508 1426 void LatestMethodCache::init(Klass* k, Method* m) {
duke@435 1427 if (!UseSharedSpaces) {
duke@435 1428 _klass = k;
duke@435 1429 }
duke@435 1430 #ifndef PRODUCT
duke@435 1431 else {
duke@435 1432 // sharing initilization should have already set up _klass
duke@435 1433 assert(_klass != NULL, "just checking");
duke@435 1434 }
duke@435 1435 #endif
duke@435 1436
duke@435 1437 _method_idnum = m->method_idnum();
duke@435 1438 assert(_method_idnum >= 0, "sanity check");
duke@435 1439 }
duke@435 1440
duke@435 1441
coleenp@5508 1442 Method* LatestMethodCache::get_method() {
mullan@5242 1443 if (klass() == NULL) return NULL;
coleenp@4037 1444 InstanceKlass* ik = InstanceKlass::cast(klass());
coleenp@4037 1445 Method* m = ik->method_with_idnum(method_idnum());
duke@435 1446 assert(m != NULL, "sanity check");
duke@435 1447 return m;
duke@435 1448 }
duke@435 1449
duke@435 1450
duke@435 1451 #ifdef ASSERT
duke@435 1452 // Release dummy object(s) at bottom of heap
duke@435 1453 bool Universe::release_fullgc_alot_dummy() {
duke@435 1454 MutexLocker ml(FullGCALot_lock);
duke@435 1455 if (_fullgc_alot_dummy_array != NULL) {
duke@435 1456 if (_fullgc_alot_dummy_next >= _fullgc_alot_dummy_array->length()) {
duke@435 1457 // No more dummies to release, release entire array instead
duke@435 1458 _fullgc_alot_dummy_array = NULL;
duke@435 1459 return false;
duke@435 1460 }
duke@435 1461 if (!UseConcMarkSweepGC) {
duke@435 1462 // Release dummy at bottom of old generation
duke@435 1463 _fullgc_alot_dummy_array->obj_at_put(_fullgc_alot_dummy_next++, NULL);
duke@435 1464 }
duke@435 1465 // Release dummy at bottom of permanent generation
duke@435 1466 _fullgc_alot_dummy_array->obj_at_put(_fullgc_alot_dummy_next++, NULL);
duke@435 1467 }
duke@435 1468 return true;
duke@435 1469 }
duke@435 1470
duke@435 1471 #endif // ASSERT

mercurial