universe.cpp 61.2 KB
Newer Older
D
duke 已提交
1
/*
2
 * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
D
duke 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
19 20 21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
D
duke 已提交
22 23 24
 *
 */

25 26
#include "precompiled.hpp"
#include "classfile/classLoader.hpp"
27
#include "classfile/classLoaderData.hpp"
28
#include "classfile/javaClasses.hpp"
29 30 31
#if INCLUDE_CDS
#include "classfile/sharedClassUtil.hpp"
#endif
32 33 34 35 36 37 38 39
#include "classfile/symbolTable.hpp"
#include "classfile/systemDictionary.hpp"
#include "classfile/vmSymbols.hpp"
#include "code/codeCache.hpp"
#include "code/dependencies.hpp"
#include "gc_interface/collectedHeap.inline.hpp"
#include "interpreter/interpreter.hpp"
#include "memory/cardTableModRefBS.hpp"
40
#include "memory/filemap.hpp"
41 42 43 44
#include "memory/gcLocker.inline.hpp"
#include "memory/genCollectedHeap.hpp"
#include "memory/genRemSet.hpp"
#include "memory/generation.hpp"
45 46
#include "memory/metadataFactory.hpp"
#include "memory/metaspaceShared.hpp"
47 48 49 50
#include "memory/oopFactory.hpp"
#include "memory/space.hpp"
#include "memory/universe.hpp"
#include "memory/universe.inline.hpp"
51 52
#include "oops/constantPool.hpp"
#include "oops/instanceClassLoaderKlass.hpp"
53
#include "oops/instanceKlass.hpp"
54
#include "oops/instanceMirrorKlass.hpp"
55 56 57 58 59 60 61 62 63 64 65 66 67
#include "oops/instanceRefKlass.hpp"
#include "oops/oop.inline.hpp"
#include "oops/typeArrayKlass.hpp"
#include "prims/jvmtiRedefineClassesTrace.hpp"
#include "runtime/arguments.hpp"
#include "runtime/deoptimization.hpp"
#include "runtime/fprofiler.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/init.hpp"
#include "runtime/java.hpp"
#include "runtime/javaCalls.hpp"
#include "runtime/sharedRuntime.hpp"
#include "runtime/synchronizer.hpp"
68
#include "runtime/thread.inline.hpp"
69 70 71 72 73 74 75
#include "runtime/timer.hpp"
#include "runtime/vm_operations.hpp"
#include "services/memoryService.hpp"
#include "utilities/copy.hpp"
#include "utilities/events.hpp"
#include "utilities/hashtable.inline.hpp"
#include "utilities/preserveException.hpp"
76 77
#include "utilities/macros.hpp"
#if INCLUDE_ALL_GCS
78 79 80
#include "gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.hpp"
#include "gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.hpp"
#include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
81
#include "gc_implementation/g1/g1CollectorPolicy_ext.hpp"
82
#include "gc_implementation/parallelScavenge/parallelScavengeHeap.hpp"
83
#endif // INCLUDE_ALL_GCS
D
duke 已提交
84

85 86
PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC

D
duke 已提交
87
// Known objects
88 89 90 91 92 93 94 95 96 97
Klass* Universe::_boolArrayKlassObj                 = NULL;
Klass* Universe::_byteArrayKlassObj                 = NULL;
Klass* Universe::_charArrayKlassObj                 = NULL;
Klass* Universe::_intArrayKlassObj                  = NULL;
Klass* Universe::_shortArrayKlassObj                = NULL;
Klass* Universe::_longArrayKlassObj                 = NULL;
Klass* Universe::_singleArrayKlassObj               = NULL;
Klass* Universe::_doubleArrayKlassObj               = NULL;
Klass* Universe::_typeArrayKlassObjs[T_VOID+1]      = { NULL /*, NULL...*/ };
Klass* Universe::_objectArrayKlassObj               = NULL;
98 99 100 101 102 103 104 105 106 107
oop Universe::_int_mirror                             = NULL;
oop Universe::_float_mirror                           = NULL;
oop Universe::_double_mirror                          = NULL;
oop Universe::_byte_mirror                            = NULL;
oop Universe::_bool_mirror                            = NULL;
oop Universe::_char_mirror                            = NULL;
oop Universe::_long_mirror                            = NULL;
oop Universe::_short_mirror                           = NULL;
oop Universe::_void_mirror                            = NULL;
oop Universe::_mirrors[T_VOID+1]                      = { NULL /*, NULL...*/ };
D
duke 已提交
108 109 110
oop Universe::_main_thread_group                      = NULL;
oop Universe::_system_thread_group                    = NULL;
objArrayOop Universe::_the_empty_class_klass_array    = NULL;
111
Array<Klass*>* Universe::_the_array_interfaces_array = NULL;
112 113
oop Universe::_the_null_string                        = NULL;
oop Universe::_the_min_jint_string                   = NULL;
114 115 116
LatestMethodCache* Universe::_finalizer_register_cache = NULL;
LatestMethodCache* Universe::_loader_addClass_cache    = NULL;
LatestMethodCache* Universe::_pd_implies_cache         = NULL;
117
LatestMethodCache* Universe::_throw_illegal_access_error_cache = NULL;
D
duke 已提交
118
oop Universe::_out_of_memory_error_java_heap          = NULL;
119 120
oop Universe::_out_of_memory_error_metaspace          = NULL;
oop Universe::_out_of_memory_error_class_metaspace    = NULL;
D
duke 已提交
121 122
oop Universe::_out_of_memory_error_array_size         = NULL;
oop Universe::_out_of_memory_error_gc_overhead_limit  = NULL;
123
oop Universe::_out_of_memory_error_realloc_objects    = NULL;
D
duke 已提交
124 125 126
objArrayOop Universe::_preallocated_out_of_memory_error_array = NULL;
volatile jint Universe::_preallocated_out_of_memory_error_avail_count = 0;
bool Universe::_verify_in_progress                    = false;
127
long Universe::verify_flags                           = Universe::Verify_All;
D
duke 已提交
128 129 130 131
oop Universe::_null_ptr_exception_instance            = NULL;
oop Universe::_arithmetic_exception_instance          = NULL;
oop Universe::_virtual_machine_error_instance         = NULL;
oop Universe::_vm_exception                           = NULL;
132 133
oop Universe::_allocation_context_notification_obj    = NULL;

134 135 136 137
Array<int>* Universe::_the_empty_int_array            = NULL;
Array<u2>* Universe::_the_empty_short_array           = NULL;
Array<Klass*>* Universe::_the_empty_klass_array     = NULL;
Array<Method*>* Universe::_the_empty_method_array   = NULL;
D
duke 已提交
138 139 140 141 142 143 144 145 146 147 148 149 150

// These variables are guarded by FullGCALot_lock.
debug_only(objArrayOop Universe::_fullgc_alot_dummy_array = NULL;)
debug_only(int Universe::_fullgc_alot_dummy_next      = 0;)

// Heap
int             Universe::_verify_count = 0;

int             Universe::_base_vtable_size = 0;
bool            Universe::_bootstrapping = false;
bool            Universe::_fully_initialized = false;

size_t          Universe::_heap_capacity_at_last_gc;
151
size_t          Universe::_heap_used_at_last_gc = 0;
D
duke 已提交
152 153

CollectedHeap*  Universe::_collectedHeap = NULL;
154

155 156 157
NarrowPtrStruct Universe::_narrow_oop = { NULL, 0, true };
NarrowPtrStruct Universe::_narrow_klass = { NULL, 0, true };
address Universe::_narrow_ptrs_base;
D
duke 已提交
158

159
void Universe::basic_type_classes_do(void f(Klass*)) {
D
duke 已提交
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
  f(boolArrayKlassObj());
  f(byteArrayKlassObj());
  f(charArrayKlassObj());
  f(intArrayKlassObj());
  f(shortArrayKlassObj());
  f(longArrayKlassObj());
  f(singleArrayKlassObj());
  f(doubleArrayKlassObj());
}

void Universe::oops_do(OopClosure* f, bool do_all) {

  f->do_oop((oop*) &_int_mirror);
  f->do_oop((oop*) &_float_mirror);
  f->do_oop((oop*) &_double_mirror);
  f->do_oop((oop*) &_byte_mirror);
  f->do_oop((oop*) &_bool_mirror);
  f->do_oop((oop*) &_char_mirror);
  f->do_oop((oop*) &_long_mirror);
  f->do_oop((oop*) &_short_mirror);
  f->do_oop((oop*) &_void_mirror);

  for (int i = T_BOOLEAN; i < T_VOID+1; i++) {
    f->do_oop((oop*) &_mirrors[i]);
  }
  assert(_mirrors[0] == NULL && _mirrors[T_BOOLEAN - 1] == NULL, "checking");

  f->do_oop((oop*)&_the_empty_class_klass_array);
188 189
  f->do_oop((oop*)&_the_null_string);
  f->do_oop((oop*)&_the_min_jint_string);
D
duke 已提交
190
  f->do_oop((oop*)&_out_of_memory_error_java_heap);
191 192
  f->do_oop((oop*)&_out_of_memory_error_metaspace);
  f->do_oop((oop*)&_out_of_memory_error_class_metaspace);
D
duke 已提交
193 194
  f->do_oop((oop*)&_out_of_memory_error_array_size);
  f->do_oop((oop*)&_out_of_memory_error_gc_overhead_limit);
195
  f->do_oop((oop*)&_out_of_memory_error_realloc_objects);
D
duke 已提交
196 197 198 199 200 201 202
    f->do_oop((oop*)&_preallocated_out_of_memory_error_array);
  f->do_oop((oop*)&_null_ptr_exception_instance);
  f->do_oop((oop*)&_arithmetic_exception_instance);
  f->do_oop((oop*)&_virtual_machine_error_instance);
  f->do_oop((oop*)&_main_thread_group);
  f->do_oop((oop*)&_system_thread_group);
  f->do_oop((oop*)&_vm_exception);
203
  f->do_oop((oop*)&_allocation_context_notification_obj);
D
duke 已提交
204 205 206
  debug_only(f->do_oop((oop*)&_fullgc_alot_dummy_array);)
}

207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236
// Serialize metadata in and out of CDS archive, not oops.
void Universe::serialize(SerializeClosure* f, bool do_all) {

  f->do_ptr((void**)&_boolArrayKlassObj);
  f->do_ptr((void**)&_byteArrayKlassObj);
  f->do_ptr((void**)&_charArrayKlassObj);
  f->do_ptr((void**)&_intArrayKlassObj);
  f->do_ptr((void**)&_shortArrayKlassObj);
  f->do_ptr((void**)&_longArrayKlassObj);
  f->do_ptr((void**)&_singleArrayKlassObj);
  f->do_ptr((void**)&_doubleArrayKlassObj);
  f->do_ptr((void**)&_objectArrayKlassObj);

  {
    for (int i = 0; i < T_VOID+1; i++) {
      if (_typeArrayKlassObjs[i] != NULL) {
        assert(i >= T_BOOLEAN, "checking");
        f->do_ptr((void**)&_typeArrayKlassObjs[i]);
      } else if (do_all) {
        f->do_ptr((void**)&_typeArrayKlassObjs[i]);
      }
    }
  }

  f->do_ptr((void**)&_the_array_interfaces_array);
  f->do_ptr((void**)&_the_empty_int_array);
  f->do_ptr((void**)&_the_empty_short_array);
  f->do_ptr((void**)&_the_empty_method_array);
  f->do_ptr((void**)&_the_empty_klass_array);
  _finalizer_register_cache->serialize(f);
237
  _loader_addClass_cache->serialize(f);
M
mullan 已提交
238
  _pd_implies_cache->serialize(f);
239
  _throw_illegal_access_error_cache->serialize(f);
240
}
D
duke 已提交
241 242 243

void Universe::check_alignment(uintx size, uintx alignment, const char* name) {
  if (size < alignment || size % alignment != 0) {
244 245
    vm_exit_during_initialization(
      err_msg("Size of %s (" UINTX_FORMAT " bytes) must be aligned to " UINTX_FORMAT " bytes", name, size, alignment));
D
duke 已提交
246 247 248
  }
}

249 250 251
void initialize_basic_type_klass(Klass* k, TRAPS) {
  Klass* ok = SystemDictionary::Object_klass();
  if (UseSharedSpaces) {
252
    ClassLoaderData* loader_data = ClassLoaderData::the_null_class_loader_data();
253
    assert(k->super() == ok, "u3");
254
    k->restore_unshareable_info(loader_data, Handle(), CHECK);
255 256 257 258 259
  } else {
    k->initialize_supers(ok, CHECK);
  }
  k->append_to_sibling_list();
}
D
duke 已提交
260 261 262

void Universe::genesis(TRAPS) {
  ResourceMark rm;
263

D
duke 已提交
264 265 266 267 268 269 270 271
  { FlagSetting fs(_bootstrapping, true);

    { MutexLocker mc(Compile_lock);

      // determine base vtable size; without that we cannot create the array klasses
      compute_base_vtable_size();

      if (!UseSharedSpaces) {
272 273 274 275 276 277 278 279
        _boolArrayKlassObj      = TypeArrayKlass::create_klass(T_BOOLEAN, sizeof(jboolean), CHECK);
        _charArrayKlassObj      = TypeArrayKlass::create_klass(T_CHAR,    sizeof(jchar),    CHECK);
        _singleArrayKlassObj    = TypeArrayKlass::create_klass(T_FLOAT,   sizeof(jfloat),   CHECK);
        _doubleArrayKlassObj    = TypeArrayKlass::create_klass(T_DOUBLE,  sizeof(jdouble),  CHECK);
        _byteArrayKlassObj      = TypeArrayKlass::create_klass(T_BYTE,    sizeof(jbyte),    CHECK);
        _shortArrayKlassObj     = TypeArrayKlass::create_klass(T_SHORT,   sizeof(jshort),   CHECK);
        _intArrayKlassObj       = TypeArrayKlass::create_klass(T_INT,     sizeof(jint),     CHECK);
        _longArrayKlassObj      = TypeArrayKlass::create_klass(T_LONG,    sizeof(jlong),    CHECK);
D
duke 已提交
280 281 282 283 284 285 286 287 288 289

        _typeArrayKlassObjs[T_BOOLEAN] = _boolArrayKlassObj;
        _typeArrayKlassObjs[T_CHAR]    = _charArrayKlassObj;
        _typeArrayKlassObjs[T_FLOAT]   = _singleArrayKlassObj;
        _typeArrayKlassObjs[T_DOUBLE]  = _doubleArrayKlassObj;
        _typeArrayKlassObjs[T_BYTE]    = _byteArrayKlassObj;
        _typeArrayKlassObjs[T_SHORT]   = _shortArrayKlassObj;
        _typeArrayKlassObjs[T_INT]     = _intArrayKlassObj;
        _typeArrayKlassObjs[T_LONG]    = _longArrayKlassObj;

290
        ClassLoaderData* null_cld = ClassLoaderData::the_null_class_loader_data();
D
duke 已提交
291

292 293 294 295 296
        _the_array_interfaces_array = MetadataFactory::new_array<Klass*>(null_cld, 2, NULL, CHECK);
        _the_empty_int_array        = MetadataFactory::new_array<int>(null_cld, 0, CHECK);
        _the_empty_short_array      = MetadataFactory::new_array<u2>(null_cld, 0, CHECK);
        _the_empty_method_array     = MetadataFactory::new_array<Method*>(null_cld, 0, CHECK);
        _the_empty_klass_array      = MetadataFactory::new_array<Klass*>(null_cld, 0, CHECK);
D
duke 已提交
297 298 299 300 301 302 303
      }
    }

    vmSymbols::initialize(CHECK);

    SystemDictionary::initialize(CHECK);

304
    Klass* ok = SystemDictionary::Object_klass();
D
duke 已提交
305

306 307 308
    _the_null_string            = StringTable::intern("null", CHECK);
    _the_min_jint_string       = StringTable::intern("-2147483648", CHECK);

D
duke 已提交
309 310
    if (UseSharedSpaces) {
      // Verify shared interfaces array.
311
      assert(_the_array_interfaces_array->at(0) ==
312
             SystemDictionary::Cloneable_klass(), "u3");
313
      assert(_the_array_interfaces_array->at(1) ==
314
             SystemDictionary::Serializable_klass(), "u3");
D
duke 已提交
315 316
    } else {
      // Set up shared interfaces array.  (Do this before supers are set up.)
317 318
      _the_array_interfaces_array->at_put(0, SystemDictionary::Cloneable_klass());
      _the_array_interfaces_array->at_put(1, SystemDictionary::Serializable_klass());
D
duke 已提交
319 320
    }

321 322 323 324 325 326 327 328
    initialize_basic_type_klass(boolArrayKlassObj(), CHECK);
    initialize_basic_type_klass(charArrayKlassObj(), CHECK);
    initialize_basic_type_klass(singleArrayKlassObj(), CHECK);
    initialize_basic_type_klass(doubleArrayKlassObj(), CHECK);
    initialize_basic_type_klass(byteArrayKlassObj(), CHECK);
    initialize_basic_type_klass(shortArrayKlassObj(), CHECK);
    initialize_basic_type_klass(intArrayKlassObj(), CHECK);
    initialize_basic_type_klass(longArrayKlassObj(), CHECK);
D
duke 已提交
329 330
  } // end of core bootstrapping

331 332 333 334
  // Maybe this could be lifted up now that object array can be initialized
  // during the bootstrapping.

  // OLD
D
duke 已提交
335 336
  // Initialize _objectArrayKlass after core bootstraping to make
  // sure the super class is set up properly for _objectArrayKlass.
337 338 339 340 341 342 343
  // ---
  // NEW
  // Since some of the old system object arrays have been converted to
  // ordinary object arrays, _objectArrayKlass will be loaded when
  // SystemDictionary::initialize(CHECK); is run. See the extra check
  // for Object_klass_loaded in objArrayKlassKlass::allocate_objArray_klass_impl.
  _objectArrayKlassObj = InstanceKlass::
344
    cast(SystemDictionary::Object_klass())->array_klass(1, CHECK);
345
  // OLD
D
duke 已提交
346 347
  // Add the class to the class hierarchy manually to make sure that
  // its vtable is initialized after core bootstrapping is completed.
348 349 350
  // ---
  // New
  // Have already been initialized.
H
hseigel 已提交
351
  _objectArrayKlassObj->append_to_sibling_list();
D
duke 已提交
352 353 354 355 356

  // Compute is_jdk version flags.
  // Only 1.3 or later has the java.lang.Shutdown class.
  // Only 1.4 or later has the java.lang.CharSequence interface.
  // Only 1.5 or later has the java.lang.management.MemoryUsage class.
K
kamg 已提交
357 358
  if (JDK_Version::is_partially_initialized()) {
    uint8_t jdk_version;
359
    Klass* k = SystemDictionary::resolve_or_null(
360
        vmSymbols::java_lang_management_MemoryUsage(), THREAD);
D
duke 已提交
361 362
    CLEAR_PENDING_EXCEPTION; // ignore exceptions
    if (k == NULL) {
K
kamg 已提交
363
      k = SystemDictionary::resolve_or_null(
364
          vmSymbols::java_lang_CharSequence(), THREAD);
D
duke 已提交
365 366
      CLEAR_PENDING_EXCEPTION; // ignore exceptions
      if (k == NULL) {
K
kamg 已提交
367
        k = SystemDictionary::resolve_or_null(
368
            vmSymbols::java_lang_Shutdown(), THREAD);
D
duke 已提交
369 370
        CLEAR_PENDING_EXCEPTION; // ignore exceptions
        if (k == NULL) {
K
kamg 已提交
371
          jdk_version = 2;
D
duke 已提交
372
        } else {
K
kamg 已提交
373
          jdk_version = 3;
D
duke 已提交
374 375
        }
      } else {
K
kamg 已提交
376
        jdk_version = 4;
D
duke 已提交
377 378
      }
    } else {
K
kamg 已提交
379
      jdk_version = 5;
D
duke 已提交
380
    }
K
kamg 已提交
381
    JDK_Version::fully_initialize(jdk_version);
D
duke 已提交
382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402
  }

  #ifdef ASSERT
  if (FullGCALot) {
    // Allocate an array of dummy objects.
    // We'd like these to be at the bottom of the old generation,
    // so that when we free one and then collect,
    // (almost) the whole heap moves
    // and we find out if we actually update all the oops correctly.
    // But we can't allocate directly in the old generation,
    // so we allocate wherever, and hope that the first collection
    // moves these objects to the bottom of the old generation.
    // We can allocate directly in the permanent generation, so we do.
    int size;
    if (UseConcMarkSweepGC) {
      warning("Using +FullGCALot with concurrent mark sweep gc "
              "will not force all objects to relocate");
      size = FullGCALotDummies;
    } else {
      size = FullGCALotDummies * 2;
    }
403
    objArrayOop    naked_array = oopFactory::new_objArray(SystemDictionary::Object_klass(), size, CHECK);
D
duke 已提交
404 405 406 407
    objArrayHandle dummy_array(THREAD, naked_array);
    int i = 0;
    while (i < size) {
        // Allocate dummy in old generation
408
      oop dummy = InstanceKlass::cast(SystemDictionary::Object_klass())->allocate_instance(CHECK);
D
duke 已提交
409 410 411 412 413 414 415 416 417 418 419 420 421 422
      dummy_array->obj_at_put(i++, dummy);
    }
    {
      // Only modify the global variable inside the mutex.
      // If we had a race to here, the other dummy_array instances
      // and their elements just get dropped on the floor, which is fine.
      MutexLocker ml(FullGCALot_lock);
      if (_fullgc_alot_dummy_array == NULL) {
        _fullgc_alot_dummy_array = dummy_array();
      }
    }
    assert(i == _fullgc_alot_dummy_array->length(), "just checking");
  }
  #endif
423 424 425 426

  // Initialize dependency array for null class loader
  ClassLoaderData::the_null_class_loader_data()->init_dependencies(CHECK);

D
duke 已提交
427 428
}

429 430 431 432 433
// CDS support for patching vtables in metadata in the shared archive.
// All types inherited from Metadata have vtables, but not types inherited
// from MetaspaceObj, because the latter does not have virtual functions.
// If the metadata type has a vtable, it cannot be shared in the read-only
// section of the CDS archive, because the vtable pointer is patched.
434 435
static inline void add_vtable(void** list, int* n, void* o, int count) {
  guarantee((*n) < count, "vtable list too small");
436 437
  void* vtable = dereference_vptr(o);
  assert(*(void**)(vtable) != NULL, "invalid vtable");
438 439
  list[(*n)++] = vtable;
}
D
duke 已提交
440 441 442

void Universe::init_self_patching_vtbl_list(void** list, int count) {
  int n = 0;
443
  { InstanceKlass o;          add_vtable(list, &n, &o, count); }
444 445 446
  { InstanceClassLoaderKlass o; add_vtable(list, &n, &o, count); }
  { InstanceMirrorKlass o;    add_vtable(list, &n, &o, count); }
  { InstanceRefKlass o;       add_vtable(list, &n, &o, count); }
447 448
  { TypeArrayKlass o;         add_vtable(list, &n, &o, count); }
  { ObjArrayKlass o;          add_vtable(list, &n, &o, count); }
449 450
  { Method o;                 add_vtable(list, &n, &o, count); }
  { ConstantPool o;           add_vtable(list, &n, &o, count); }
D
duke 已提交
451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482
}

void Universe::initialize_basic_type_mirrors(TRAPS) {
    assert(_int_mirror==NULL, "basic type mirrors already initialized");
    _int_mirror     =
      java_lang_Class::create_basic_type_mirror("int",    T_INT, CHECK);
    _float_mirror   =
      java_lang_Class::create_basic_type_mirror("float",  T_FLOAT,   CHECK);
    _double_mirror  =
      java_lang_Class::create_basic_type_mirror("double", T_DOUBLE,  CHECK);
    _byte_mirror    =
      java_lang_Class::create_basic_type_mirror("byte",   T_BYTE, CHECK);
    _bool_mirror    =
      java_lang_Class::create_basic_type_mirror("boolean",T_BOOLEAN, CHECK);
    _char_mirror    =
      java_lang_Class::create_basic_type_mirror("char",   T_CHAR, CHECK);
    _long_mirror    =
      java_lang_Class::create_basic_type_mirror("long",   T_LONG, CHECK);
    _short_mirror   =
      java_lang_Class::create_basic_type_mirror("short",  T_SHORT,   CHECK);
    _void_mirror    =
      java_lang_Class::create_basic_type_mirror("void",   T_VOID, CHECK);

    _mirrors[T_INT]     = _int_mirror;
    _mirrors[T_FLOAT]   = _float_mirror;
    _mirrors[T_DOUBLE]  = _double_mirror;
    _mirrors[T_BYTE]    = _byte_mirror;
    _mirrors[T_BOOLEAN] = _bool_mirror;
    _mirrors[T_CHAR]    = _char_mirror;
    _mirrors[T_LONG]    = _long_mirror;
    _mirrors[T_SHORT]   = _short_mirror;
    _mirrors[T_VOID]    = _void_mirror;
483 484
  //_mirrors[T_OBJECT]  = InstanceKlass::cast(_object_klass)->java_mirror();
  //_mirrors[T_ARRAY]   = InstanceKlass::cast(_object_klass)->java_mirror();
D
duke 已提交
485 486 487 488 489 490 491
}

void Universe::fixup_mirrors(TRAPS) {
  // Bootstrap problem: all classes gets a mirror (java.lang.Class instance) assigned eagerly,
  // but we cannot do that for classes created before java.lang.Class is loaded. Here we simply
  // walk over permanent objects created so far (mostly classes) and fixup their mirrors. Note
  // that the number of objects allocated at this point is very small.
492
  assert(SystemDictionary::Class_klass_loaded(), "java.lang.Class should be loaded");
493
  HandleMark hm(THREAD);
494
  // Cache the start of the static fields
495
  InstanceMirrorKlass::init_offset_of_static_fields();
496

497 498 499 500 501 502 503 504 505 506 507
  GrowableArray <Klass*>* list = java_lang_Class::fixup_mirror_list();
  int list_length = list->length();
  for (int i = 0; i < list_length; i++) {
    Klass* k = list->at(i);
    assert(k->is_klass(), "List should only hold classes");
    EXCEPTION_MARK;
    KlassHandle kh(THREAD, k);
    java_lang_Class::fixup_mirror(kh, CATCH);
}
  delete java_lang_Class::fixup_mirror_list();
  java_lang_Class::set_fixup_mirror_list(NULL);
D
duke 已提交
508 509 510 511 512 513 514 515 516 517 518 519
}

static bool has_run_finalizers_on_exit = false;

void Universe::run_finalizers_on_exit() {
  if (has_run_finalizers_on_exit) return;
  has_run_finalizers_on_exit = true;

  // Called on VM exit. This ought to be run in a separate thread.
  if (TraceReferenceGC) tty->print_cr("Callback to run finalizers on exit");
  {
    PRESERVE_EXCEPTION_MARK;
520
    KlassHandle finalizer_klass(THREAD, SystemDictionary::Finalizer_klass());
D
duke 已提交
521 522 523 524
    JavaValue result(T_VOID);
    JavaCalls::call_static(
      &result,
      finalizer_klass,
525 526
      vmSymbols::run_finalizers_on_exit_name(),
      vmSymbols::void_method_signature(),
D
duke 已提交
527 528 529 530 531 532 533 534 535 536 537 538 539 540
      THREAD
    );
    // Ignore any pending exceptions
    CLEAR_PENDING_EXCEPTION;
  }
}


// initialize_vtable could cause gc if
// 1) we specified true to initialize_vtable and
// 2) this ran after gc was enabled
// In case those ever change we use handles for oops
void Universe::reinitialize_vtable_of(KlassHandle k_h, TRAPS) {
  // init vtable of k and all subclasses
541
  Klass* ko = k_h();
D
duke 已提交
542 543 544
  klassVtable* vt = ko->vtable();
  if (vt) vt->initialize_vtable(false, CHECK);
  if (ko->oop_is_instance()) {
545
    InstanceKlass* ik = (InstanceKlass*)ko;
546 547 548
    for (KlassHandle s_h(THREAD, ik->subklass());
         s_h() != NULL;
         s_h = KlassHandle(THREAD, s_h()->next_sibling())) {
D
duke 已提交
549 550 551 552 553 554
      reinitialize_vtable_of(s_h, CHECK);
    }
  }
}


555 556
void initialize_itable_for_klass(Klass* k, TRAPS) {
  InstanceKlass::cast(k)->itable()->initialize_itable(false, CHECK);
D
duke 已提交
557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577
}


void Universe::reinitialize_itables(TRAPS) {
  SystemDictionary::classes_do(initialize_itable_for_klass, CHECK);

}


bool Universe::on_page_boundary(void* addr) {
  return ((uintptr_t) addr) % os::vm_page_size() == 0;
}


bool Universe::should_fill_in_stack_trace(Handle throwable) {
  // never attempt to fill in the stack trace of preallocated errors that do not have
  // backtrace. These errors are kept alive forever and may be "re-used" when all
  // preallocated errors with backtrace have been consumed. Also need to avoid
  // a potential loop which could happen if an out of memory occurs when attempting
  // to allocate the backtrace.
  return ((throwable() != Universe::_out_of_memory_error_java_heap) &&
578 579
          (throwable() != Universe::_out_of_memory_error_metaspace)  &&
          (throwable() != Universe::_out_of_memory_error_class_metaspace)  &&
D
duke 已提交
580
          (throwable() != Universe::_out_of_memory_error_array_size) &&
581 582
          (throwable() != Universe::_out_of_memory_error_gc_overhead_limit) &&
          (throwable() != Universe::_out_of_memory_error_realloc_objects));
D
duke 已提交
583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620
}


oop Universe::gen_out_of_memory_error(oop default_err) {
  // generate an out of memory error:
  // - if there is a preallocated error with backtrace available then return it wth
  //   a filled in stack trace.
  // - if there are no preallocated errors with backtrace available then return
  //   an error without backtrace.
  int next;
  if (_preallocated_out_of_memory_error_avail_count > 0) {
    next = (int)Atomic::add(-1, &_preallocated_out_of_memory_error_avail_count);
    assert(next < (int)PreallocatedOutOfMemoryErrorCount, "avail count is corrupt");
  } else {
    next = -1;
  }
  if (next < 0) {
    // all preallocated errors have been used.
    // return default
    return default_err;
  } else {
    // get the error object at the slot and set set it to NULL so that the
    // array isn't keeping it alive anymore.
    oop exc = preallocated_out_of_memory_errors()->obj_at(next);
    assert(exc != NULL, "slot has been used already");
    preallocated_out_of_memory_errors()->obj_at_put(next, NULL);

    // use the message from the default error
    oop msg = java_lang_Throwable::message(default_err);
    assert(msg != NULL, "no message");
    java_lang_Throwable::set_message(exc, msg);

    // populate the stack trace and return it.
    java_lang_Throwable::fill_in_stack_trace_of_preallocated_backtrace(exc);
    return exc;
  }
}

621
intptr_t Universe::_non_oop_bits = 0;
D
duke 已提交
622 623 624 625 626 627 628 629 630 631 632 633 634

void* Universe::non_oop_word() {
  // Neither the high bits nor the low bits of this value is allowed
  // to look like (respectively) the high or low bits of a real oop.
  //
  // High and low are CPU-specific notions, but low always includes
  // the low-order bit.  Since oops are always aligned at least mod 4,
  // setting the low-order bit will ensure that the low half of the
  // word will never look like that of a real oop.
  //
  // Using the OS-supplied non-memory-address word (usually 0 or -1)
  // will take care of the high bits, however many there are.

635 636
  if (_non_oop_bits == 0) {
    _non_oop_bits = (intptr_t)os::non_memory_address_word() | 1;
D
duke 已提交
637 638
  }

639
  return (void*)_non_oop_bits;
D
duke 已提交
640 641 642 643 644 645 646 647
}

jint universe_init() {
  assert(!Universe::_fully_initialized, "called after initialize_vtables");
  guarantee(1 << LogHeapWordSize == sizeof(HeapWord),
         "LogHeapWordSize is incorrect.");
  guarantee(sizeof(oop) >= sizeof(HeapWord), "HeapWord larger than oop?");
  guarantee(sizeof(oop) % sizeof(HeapWord) == 0,
648
            "oop size is not not a multiple of HeapWord size");
D
duke 已提交
649 650 651 652 653 654 655 656
  TraceTime timer("Genesis", TraceStartupTime);
  JavaClasses::compute_hard_coded_offsets();

  jint status = Universe::initialize_heap();
  if (status != JNI_OK) {
    return status;
  }

657 658
  Metaspace::global_initialize();

659 660 661 662 663 664
  // Create memory for metadata.  Must be after initializing heap for
  // DumpSharedSpaces.
  ClassLoaderData::init_null_class_loader_data();

  // We have a heap so create the Method* caches before
  // Metaspace::initialize_shared_spaces() tries to populate them.
665 666 667
  Universe::_finalizer_register_cache = new LatestMethodCache();
  Universe::_loader_addClass_cache    = new LatestMethodCache();
  Universe::_pd_implies_cache         = new LatestMethodCache();
668
  Universe::_throw_illegal_access_error_cache = new LatestMethodCache();
D
duke 已提交
669 670 671 672 673 674 675

  if (UseSharedSpaces) {
    // Read the data structures supporting the shared spaces (shared
    // system dictionary, symbol table, etc.).  After that, access to
    // the file (other than the mapped regions) is no longer needed, and
    // the file is closed. Closing the file does not affect the
    // currently mapped regions.
676 677
    MetaspaceShared::initialize_shared_spaces();
    StringTable::create_table();
D
duke 已提交
678 679 680 681
  } else {
    SymbolTable::create_table();
    StringTable::create_table();
    ClassLoader::create_package_info_table();
682 683 684 685

    if (DumpSharedSpaces) {
      MetaspaceShared::prepare_for_dumping();
    }
D
duke 已提交
686
  }
687 688 689
  if (strlen(VerifySubSet) > 0) {
    Universe::initialize_verify_flags();
  }
D
duke 已提交
690 691 692 693

  return JNI_OK;
}

694 695 696 697 698 699 700 701 702
// Choose the heap base address and oop encoding mode
// when compressed oops are used:
// Unscaled  - Use 32-bits oops without encoding when
//     NarrowOopHeapBaseMin + heap_size < 4Gb
// ZeroBased - Use zero based compressed oops with encoding when
//     NarrowOopHeapBaseMin + heap_size < 32Gb
// HeapBased - Use compressed oops with heap base + encoding.

// 4Gb
703
static const uint64_t UnscaledOopHeapMax = (uint64_t(max_juint) + 1);
704
// 32Gb
705
// OopEncodingHeapMax == UnscaledOopHeapMax << LogMinObjAlignmentInBytes;
706

707 708
char* Universe::preferred_heap_base(size_t heap_size, size_t alignment, NARROW_OOP_MODE mode) {
  assert(is_size_aligned((size_t)OopEncodingHeapMax, alignment), "Must be");
709
  assert(is_size_aligned((size_t)UnscaledOopHeapMax, alignment), "Must be");
710 711 712 713
  assert(is_size_aligned(heap_size, alignment), "Must be");

  uintx heap_base_min_address_aligned = align_size_up(HeapBaseMinAddress, alignment);

714
  size_t base = 0;
715 716 717 718 719
#ifdef _LP64
  if (UseCompressedOops) {
    assert(mode == UnscaledNarrowOop  ||
           mode == ZeroBasedNarrowOop ||
           mode == HeapBasedNarrowOop, "mode is invalid");
720
    const size_t total_size = heap_size + heap_base_min_address_aligned;
721 722
    // Return specified base for the first request.
    if (!FLAG_IS_DEFAULT(HeapBaseMinAddress) && (mode == UnscaledNarrowOop)) {
723
      base = heap_base_min_address_aligned;
724

725 726 727
    // If the total size is small enough to allow UnscaledNarrowOop then
    // just use UnscaledNarrowOop.
    } else if ((total_size <= OopEncodingHeapMax) && (mode != HeapBasedNarrowOop)) {
728
      if ((total_size <= UnscaledOopHeapMax) && (mode == UnscaledNarrowOop) &&
729 730 731
          (Universe::narrow_oop_shift() == 0)) {
        // Use 32-bits oops without encoding and
        // place heap's top on the 4Gb boundary
732
        base = (UnscaledOopHeapMax - heap_size);
733 734 735
      } else {
        // Can't reserve with NarrowOopShift == 0
        Universe::set_narrow_oop_shift(LogMinObjAlignmentInBytes);
736

737
        if (mode == UnscaledNarrowOop ||
738 739
            mode == ZeroBasedNarrowOop && total_size <= UnscaledOopHeapMax) {

740 741 742
          // Use zero based compressed oops with encoding and
          // place heap's top on the 32Gb boundary in case
          // total_size > 4Gb or failed to reserve below 4Gb.
743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761
          uint64_t heap_top = OopEncodingHeapMax;

          // For small heaps, save some space for compressed class pointer
          // space so it can be decoded with no base.
          if (UseCompressedClassPointers && !UseSharedSpaces &&
              OopEncodingHeapMax <= 32*G) {

            uint64_t class_space = align_size_up(CompressedClassSpaceSize, alignment);
            assert(is_size_aligned((size_t)OopEncodingHeapMax-class_space,
                   alignment), "difference must be aligned too");
            uint64_t new_top = OopEncodingHeapMax-class_space;

            if (total_size <= new_top) {
              heap_top = new_top;
            }
          }

          // Align base to the adjusted top of the heap
          base = heap_top - heap_size;
762 763 764
        }
      }
    } else {
765 766
      // UnscaledNarrowOop encoding didn't work, and no base was found for ZeroBasedOops or
      // HeapBasedNarrowOop encoding was requested.  So, can't reserve below 32Gb.
767 768
      Universe::set_narrow_oop_shift(LogMinObjAlignmentInBytes);
    }
769

770 771 772
    // Set narrow_oop_base and narrow_oop_use_implicit_null_checks
    // used in ReservedHeapSpace() constructors.
    // The final values will be set in initialize_heap() below.
773
    if ((base != 0) && ((base + heap_size) <= OopEncodingHeapMax)) {
774 775 776 777 778 779 780 781 782
      // Use zero based compressed oops
      Universe::set_narrow_oop_base(NULL);
      // Don't need guard page for implicit checks in indexed
      // addressing mode with zero based Compressed Oops.
      Universe::set_narrow_oop_use_implicit_null_checks(true);
    } else {
      // Set to a non-NULL value so the ReservedSpace ctor computes
      // the correct no-access prefix.
      // The final value will be set in initialize_heap() below.
783
      Universe::set_narrow_oop_base((address)UnscaledOopHeapMax);
784
#if defined(_WIN64) || defined(AIX)
785 786 787 788 789 790 791
      if (UseLargePages) {
        // Cannot allocate guard pages for implicit checks in indexed
        // addressing mode when large pages are specified on windows.
        Universe::set_narrow_oop_use_implicit_null_checks(false);
      }
#endif //  _WIN64
    }
792 793
  }
#endif
794 795

  assert(is_ptr_aligned((char*)base, alignment), "Must be");
796
  return (char*)base; // also return NULL (don't care) for 32-bit VM
797 798
}

D
duke 已提交
799 800 801
jint Universe::initialize_heap() {

  if (UseParallelGC) {
802
#if INCLUDE_ALL_GCS
D
duke 已提交
803
    Universe::_collectedHeap = new ParallelScavengeHeap();
804
#else  // INCLUDE_ALL_GCS
805
    fatal("UseParallelGC not supported in this VM.");
806
#endif // INCLUDE_ALL_GCS
D
duke 已提交
807

808
  } else if (UseG1GC) {
809
#if INCLUDE_ALL_GCS
810
    G1CollectorPolicyExt* g1p = new G1CollectorPolicyExt();
811
    g1p->initialize_all();
812 813
    G1CollectedHeap* g1h = new G1CollectedHeap(g1p);
    Universe::_collectedHeap = g1h;
814
#else  // INCLUDE_ALL_GCS
815
    fatal("UseG1GC not supported in java kernel vm.");
816
#endif // INCLUDE_ALL_GCS
817

D
duke 已提交
818 819 820 821 822 823
  } else {
    GenCollectorPolicy *gc_policy;

    if (UseSerialGC) {
      gc_policy = new MarkSweepPolicy();
    } else if (UseConcMarkSweepGC) {
824
#if INCLUDE_ALL_GCS
D
duke 已提交
825 826 827 828 829
      if (UseAdaptiveSizePolicy) {
        gc_policy = new ASConcurrentMarkSweepPolicy();
      } else {
        gc_policy = new ConcurrentMarkSweepPolicy();
      }
830
#else  // INCLUDE_ALL_GCS
831
    fatal("UseConcMarkSweepGC not supported in this VM.");
832
#endif // INCLUDE_ALL_GCS
D
duke 已提交
833 834 835
    } else { // default old generation
      gc_policy = new MarkSweepPolicy();
    }
836
    gc_policy->initialize_all();
D
duke 已提交
837 838 839 840

    Universe::_collectedHeap = new GenCollectedHeap(gc_policy);
  }

B
brutisso 已提交
841 842
  ThreadLocalAllocBuffer::set_max_size(Universe::heap()->max_tlab_size());

D
duke 已提交
843 844 845 846
  jint status = Universe::heap()->initialize();
  if (status != JNI_OK) {
    return status;
  }
847 848

#ifdef _LP64
849 850 851 852 853 854 855
  if (UseCompressedOops) {
    // Subtract a page because something can get allocated at heap base.
    // This also makes implicit null checking work, because the
    // memory+1 page below heap_base needs to cause a signal.
    // See needs_explicit_null_check.
    // Only set the heap base for compressed oops because it indicates
    // compressed oops for pstack code.
856
    if (((uint64_t)Universe::heap()->reserved_region().end() > OopEncodingHeapMax)) {
857
      // Can't reserve heap below 32Gb.
858
      // keep the Universe::narrow_oop_base() set in Universe::reserve_heap()
859
      Universe::set_narrow_oop_shift(LogMinObjAlignmentInBytes);
860 861 862 863 864
#ifdef AIX
      // There is no protected page before the heap. This assures all oops
      // are decoded so that NULL is preserved, so this page will not be accessed.
      Universe::set_narrow_oop_use_implicit_null_checks(false);
#endif
865 866 867 868 869 870 871 872 873
    } else {
      Universe::set_narrow_oop_base(0);
#ifdef _WIN64
      if (!Universe::narrow_oop_use_implicit_null_checks()) {
        // Don't need guard page for implicit checks in indexed addressing
        // mode with zero based Compressed Oops.
        Universe::set_narrow_oop_use_implicit_null_checks(true);
      }
#endif //  _WIN64
874
      if((uint64_t)Universe::heap()->reserved_region().end() > UnscaledOopHeapMax) {
875 876 877
        // Can't reserve heap below 4Gb.
        Universe::set_narrow_oop_shift(LogMinObjAlignmentInBytes);
      } else {
878
        Universe::set_narrow_oop_shift(0);
879 880
      }
    }
881

882
    Universe::set_narrow_ptrs_base(Universe::narrow_oop_base());
883 884 885 886

    if (PrintCompressedOopsMode || (PrintMiscellaneous && Verbose)) {
      Universe::print_compressed_oops_mode();
    }
887
  }
888 889 890
  // Universe::narrow_oop_base() is one page below the heap.
  assert((intptr_t)Universe::narrow_oop_base() <= (intptr_t)(Universe::heap()->base() -
         os::vm_page_size()) ||
891 892 893 894
         Universe::narrow_oop_base() == NULL, "invalid value");
  assert(Universe::narrow_oop_shift() == LogMinObjAlignmentInBytes ||
         Universe::narrow_oop_shift() == 0, "invalid value");
#endif
D
duke 已提交
895 896 897 898 899 900 901 902 903 904 905 906

  // We will never reach the CATCH below since Exceptions::_throw will cause
  // the VM to exit if an exception is thrown during initialization

  if (UseTLAB) {
    assert(Universe::heap()->supports_tlab_allocation(),
           "Should support thread-local allocation buffers");
    ThreadLocalAllocBuffer::startup_initialization();
  }
  return JNI_OK;
}

907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924
void Universe::print_compressed_oops_mode() {
  tty->cr();
  tty->print("heap address: " PTR_FORMAT ", size: " SIZE_FORMAT " MB",
              Universe::heap()->base(), Universe::heap()->reserved_region().byte_size()/M);

  tty->print(", Compressed Oops mode: %s", narrow_oop_mode_to_string(narrow_oop_mode()));

  if (Universe::narrow_oop_base() != 0) {
    tty->print(":" PTR_FORMAT, Universe::narrow_oop_base());
  }

  if (Universe::narrow_oop_shift() != 0) {
    tty->print(", Oop shift amount: %d", Universe::narrow_oop_shift());
  }

  tty->cr();
  tty->cr();
}
925 926 927

// Reserve the Java heap, which is now the same for all GCs.
ReservedSpace Universe::reserve_heap(size_t heap_size, size_t alignment) {
928 929 930
  assert(alignment <= Arguments::conservative_max_heap_alignment(),
      err_msg("actual alignment "SIZE_FORMAT" must be within maximum heap alignment "SIZE_FORMAT,
          alignment, Arguments::conservative_max_heap_alignment()));
931
  size_t total_reserved = align_size_up(heap_size, alignment);
932 933
  assert(!UseCompressedOops || (total_reserved <= (OopEncodingHeapMax - os::vm_page_size())),
      "heap size is too big for compressed oops");
934

935 936
  bool use_large_pages = UseLargePages && is_size_aligned(alignment, os::large_page_size());
  assert(!UseLargePages
937
      || UseParallelGC
938 939 940 941 942
      || use_large_pages, "Wrong alignment to use large pages");

  char* addr = Universe::preferred_heap_base(total_reserved, alignment, Universe::UnscaledNarrowOop);

  ReservedHeapSpace total_rs(total_reserved, alignment, use_large_pages, addr);
943 944 945 946 947 948

  if (UseCompressedOops) {
    if (addr != NULL && !total_rs.is_reserved()) {
      // Failed to reserve at specified address - the requested memory
      // region is taken already, for example, by 'java' launcher.
      // Try again to reserver heap higher.
949
      addr = Universe::preferred_heap_base(total_reserved, alignment, Universe::ZeroBasedNarrowOop);
950 951

      ReservedHeapSpace total_rs0(total_reserved, alignment,
952
          use_large_pages, addr);
953 954 955

      if (addr != NULL && !total_rs0.is_reserved()) {
        // Failed to reserve at specified address again - give up.
956
        addr = Universe::preferred_heap_base(total_reserved, alignment, Universe::HeapBasedNarrowOop);
957 958 959
        assert(addr == NULL, "");

        ReservedHeapSpace total_rs1(total_reserved, alignment,
960
            use_large_pages, addr);
961 962 963 964 965 966 967 968
        total_rs = total_rs1;
      } else {
        total_rs = total_rs0;
      }
    }
  }

  if (!total_rs.is_reserved()) {
969
    vm_exit_during_initialization(err_msg("Could not reserve enough space for " SIZE_FORMAT "KB object heap", total_reserved/K));
970 971 972
    return total_rs;
  }

973 974 975 976 977 978
  if (UseCompressedOops) {
    // Universe::initialize_heap() will reset this to NULL if unscaled
    // or zero-based narrow oops are actually used.
    address base = (address)(total_rs.base() - os::vm_page_size());
    Universe::set_narrow_oop_base(base);
  }
979
  return total_rs;
980 981 982
}


983
// It's the caller's responsibility to ensure glitch-freedom
D
duke 已提交
984 985 986 987 988 989 990
// (if required).
void Universe::update_heap_info_at_gc() {
  _heap_capacity_at_last_gc = heap()->capacity();
  _heap_used_at_last_gc     = heap()->used();
}


S
sla 已提交
991 992 993
const char* Universe::narrow_oop_mode_to_string(Universe::NARROW_OOP_MODE mode) {
  switch (mode) {
    case UnscaledNarrowOop:
994
      return "32-bit";
S
sla 已提交
995
    case ZeroBasedNarrowOop:
996
      return "Zero based";
S
sla 已提交
997
    case HeapBasedNarrowOop:
998
      return "Non-zero based";
S
sla 已提交
999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
  }

  ShouldNotReachHere();
  return "";
}


Universe::NARROW_OOP_MODE Universe::narrow_oop_mode() {
  if (narrow_oop_base() != 0) {
    return HeapBasedNarrowOop;
  }

  if (narrow_oop_shift() != 0) {
    return ZeroBasedNarrowOop;
  }

  return UnscaledNarrowOop;
}

D
duke 已提交
1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028

void universe2_init() {
  EXCEPTION_MARK;
  Universe::genesis(CATCH);
}


// This function is defined in JVM.cpp
extern void initialize_converter_functions();

bool universe_post_init() {
1029
  assert(!is_init_completed(), "Error: initialization not yet completed!");
D
duke 已提交
1030 1031 1032 1033 1034
  Universe::_fully_initialized = true;
  EXCEPTION_MARK;
  { ResourceMark rm;
    Interpreter::initialize();      // needed for interpreter entry points
    if (!UseSharedSpaces) {
1035
      HandleMark hm(THREAD);
1036
      KlassHandle ok_h(THREAD, SystemDictionary::Object_klass());
D
duke 已提交
1037 1038 1039 1040 1041
      Universe::reinitialize_vtable_of(ok_h, CHECK_false);
      Universe::reinitialize_itables(CHECK_false);
    }
  }

1042 1043
  HandleMark hm(THREAD);
  Klass* k;
D
duke 已提交
1044 1045
  instanceKlassHandle k_h;
    // Setup preallocated empty java.lang.Class array
1046
    Universe::_the_empty_class_klass_array = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_false);
1047

D
duke 已提交
1048
    // Setup preallocated OutOfMemoryError errors
1049
    k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_OutOfMemoryError(), true, CHECK_false);
D
duke 已提交
1050
    k_h = instanceKlassHandle(THREAD, k);
1051
    Universe::_out_of_memory_error_java_heap = k_h->allocate_instance(CHECK_false);
1052 1053
    Universe::_out_of_memory_error_metaspace = k_h->allocate_instance(CHECK_false);
    Universe::_out_of_memory_error_class_metaspace = k_h->allocate_instance(CHECK_false);
1054
    Universe::_out_of_memory_error_array_size = k_h->allocate_instance(CHECK_false);
D
duke 已提交
1055
    Universe::_out_of_memory_error_gc_overhead_limit =
1056
      k_h->allocate_instance(CHECK_false);
1057
    Universe::_out_of_memory_error_realloc_objects = k_h->allocate_instance(CHECK_false);
D
duke 已提交
1058 1059 1060

    // Setup preallocated NullPointerException
    // (this is currently used for a cheap & dirty solution in compiler exception handling)
1061
    k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_NullPointerException(), true, CHECK_false);
1062
    Universe::_null_ptr_exception_instance = InstanceKlass::cast(k)->allocate_instance(CHECK_false);
D
duke 已提交
1063 1064
    // Setup preallocated ArithmeticException
    // (this is currently used for a cheap & dirty solution in compiler exception handling)
1065
    k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_ArithmeticException(), true, CHECK_false);
1066
    Universe::_arithmetic_exception_instance = InstanceKlass::cast(k)->allocate_instance(CHECK_false);
D
duke 已提交
1067 1068
    // Virtual Machine Error for when we get into a situation we can't resolve
    k = SystemDictionary::resolve_or_fail(
1069
      vmSymbols::java_lang_VirtualMachineError(), true, CHECK_false);
1070
    bool linked = InstanceKlass::cast(k)->link_class_or_fail(CHECK_false);
D
duke 已提交
1071 1072 1073 1074 1075
    if (!linked) {
      tty->print_cr("Unable to link/verify VirtualMachineError class");
      return false; // initialization failed
    }
    Universe::_virtual_machine_error_instance =
1076
      InstanceKlass::cast(k)->allocate_instance(CHECK_false);
1077

1078
    Universe::_vm_exception = InstanceKlass::cast(k)->allocate_instance(CHECK_false);
1079

D
duke 已提交
1080 1081 1082 1083 1084 1085
  if (!DumpSharedSpaces) {
    // These are the only Java fields that are currently set during shared space dumping.
    // We prefer to not handle this generally, so we always reinitialize these detail messages.
    Handle msg = java_lang_String::create_from_str("Java heap space", CHECK_false);
    java_lang_Throwable::set_message(Universe::_out_of_memory_error_java_heap, msg());

1086
    msg = java_lang_String::create_from_str("Metaspace", CHECK_false);
1087
    java_lang_Throwable::set_message(Universe::_out_of_memory_error_metaspace, msg());
1088
    msg = java_lang_String::create_from_str("Compressed class space", CHECK_false);
1089
    java_lang_Throwable::set_message(Universe::_out_of_memory_error_class_metaspace, msg());
D
duke 已提交
1090 1091 1092 1093 1094 1095 1096

    msg = java_lang_String::create_from_str("Requested array size exceeds VM limit", CHECK_false);
    java_lang_Throwable::set_message(Universe::_out_of_memory_error_array_size, msg());

    msg = java_lang_String::create_from_str("GC overhead limit exceeded", CHECK_false);
    java_lang_Throwable::set_message(Universe::_out_of_memory_error_gc_overhead_limit, msg());

1097 1098 1099
    msg = java_lang_String::create_from_str("Java heap space: failed reallocation of scalar replaced objects", CHECK_false);
    java_lang_Throwable::set_message(Universe::_out_of_memory_error_realloc_objects, msg());

D
duke 已提交
1100 1101 1102 1103 1104
    msg = java_lang_String::create_from_str("/ by zero", CHECK_false);
    java_lang_Throwable::set_message(Universe::_arithmetic_exception_instance, msg());

    // Setup the array of errors that have preallocated backtrace
    k = Universe::_out_of_memory_error_java_heap->klass();
1105
    assert(k->name() == vmSymbols::java_lang_OutOfMemoryError(), "should be out of memory error");
D
duke 已提交
1106 1107 1108 1109 1110
    k_h = instanceKlassHandle(THREAD, k);

    int len = (StackTraceInThrowable) ? (int)PreallocatedOutOfMemoryErrorCount : 0;
    Universe::_preallocated_out_of_memory_error_array = oopFactory::new_objArray(k_h(), len, CHECK_false);
    for (int i=0; i<len; i++) {
1111
      oop err = k_h->allocate_instance(CHECK_false);
D
duke 已提交
1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122
      Handle err_h = Handle(THREAD, err);
      java_lang_Throwable::allocate_backtrace(err_h, CHECK_false);
      Universe::preallocated_out_of_memory_errors()->obj_at_put(i, err_h());
    }
    Universe::_preallocated_out_of_memory_error_avail_count = (jint)len;
  }


  // Setup static method for registering finalizers
  // The finalizer klass must be linked before looking up the method, in
  // case it needs to get rewritten.
1123 1124
  InstanceKlass::cast(SystemDictionary::Finalizer_klass())->link_class(CHECK_false);
  Method* m = InstanceKlass::cast(SystemDictionary::Finalizer_klass())->find_method(
D
duke 已提交
1125 1126 1127
                                  vmSymbols::register_method_name(),
                                  vmSymbols::register_method_signature());
  if (m == NULL || !m->is_static()) {
1128 1129
    tty->print_cr("Unable to link/verify Finalizer.register method");
    return false; // initialization failed (cannot throw exception yet)
D
duke 已提交
1130 1131
  }
  Universe::_finalizer_register_cache->init(
1132
    SystemDictionary::Finalizer_klass(), m);
D
duke 已提交
1133

1134 1135 1136 1137 1138 1139 1140 1141 1142 1143
  InstanceKlass::cast(SystemDictionary::misc_Unsafe_klass())->link_class(CHECK_false);
  m = InstanceKlass::cast(SystemDictionary::misc_Unsafe_klass())->find_method(
                                  vmSymbols::throwIllegalAccessError_name(),
                                  vmSymbols::void_method_signature());
  if (m != NULL && !m->is_static()) {
    // Note null is okay; this method is used in itables, and if it is null,
    // then AbstractMethodError is thrown instead.
    tty->print_cr("Unable to link/verify Unsafe.throwIllegalAccessError method");
    return false; // initialization failed (cannot throw exception yet)
  }
1144 1145
  Universe::_throw_illegal_access_error_cache->init(
    SystemDictionary::misc_Unsafe_klass(), m);
1146

1147 1148 1149 1150
  // Setup method for registering loaded classes in class loader vector
  InstanceKlass::cast(SystemDictionary::ClassLoader_klass())->link_class(CHECK_false);
  m = InstanceKlass::cast(SystemDictionary::ClassLoader_klass())->find_method(vmSymbols::addClass_name(), vmSymbols::class_void_signature());
  if (m == NULL || m->is_static()) {
1151 1152
    tty->print_cr("Unable to link/verify ClassLoader.addClass method");
    return false; // initialization failed (cannot throw exception yet)
1153 1154
  }
  Universe::_loader_addClass_cache->init(
1155
    SystemDictionary::ClassLoader_klass(), m);
1156

M
mullan 已提交
1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170
  // Setup method for checking protection domain
  InstanceKlass::cast(SystemDictionary::ProtectionDomain_klass())->link_class(CHECK_false);
  m = InstanceKlass::cast(SystemDictionary::ProtectionDomain_klass())->
            find_method(vmSymbols::impliesCreateAccessControlContext_name(),
                        vmSymbols::void_boolean_signature());
  // Allow NULL which should only happen with bootstrapping.
  if (m != NULL) {
    if (m->is_static()) {
      // NoSuchMethodException doesn't actually work because it tries to run the
      // <init> function before java_lang_Class is linked. Print error and exit.
      tty->print_cr("ProtectionDomain.impliesCreateAccessControlContext() has the wrong linkage");
      return false; // initialization failed
    }
    Universe::_pd_implies_cache->init(
1171
      SystemDictionary::ProtectionDomain_klass(), m);
M
mullan 已提交
1172 1173
  }

D
duke 已提交
1174 1175 1176 1177 1178 1179 1180
  // The folowing is initializing converter functions for serialization in
  // JVM.cpp. If we clean up the StrictMath code above we may want to find
  // a better solution for this as well.
  initialize_converter_functions();

  // This needs to be done before the first scavenge/gc, since
  // it's an input to soft ref clearing policy.
1181 1182 1183 1184
  {
    MutexLocker x(Heap_lock);
    Universe::update_heap_info_at_gc();
  }
D
duke 已提交
1185 1186 1187 1188

  // ("weak") refs processing infrastructure initialization
  Universe::heap()->post_initialize();

1189 1190
  // Initialize performance counters for metaspaces
  MetaspaceCounters::initialize_performance_counters();
1191 1192
  CompressedClassSpaceCounters::initialize_performance_counters();

1193
  MemoryService::add_metaspace_memory_pools();
1194

D
duke 已提交
1195
  MemoryService::set_universe_heap(Universe::_collectedHeap);
1196 1197 1198 1199 1200
#if INCLUDE_CDS
  if (UseSharedSpaces) {
    SharedClassUtil::initialize(CHECK_false);
  }
#endif
D
duke 已提交
1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221
  return true;
}


void Universe::compute_base_vtable_size() {
  _base_vtable_size = ClassLoader::compute_Object_vtable();
}


// %%% The Universe::flush_foo methods belong in CodeCache.

// Flushes compiled methods dependent on dependee.
void Universe::flush_dependents_on(instanceKlassHandle dependee) {
  assert_lock_strong(Compile_lock);

  if (CodeCache::number_of_nmethods_with_dependencies() == 0) return;

  // CodeCache can only be updated by a thread_in_VM and they will all be
  // stopped dring the safepoint so CodeCache will be safe to update without
  // holding the CodeCache_lock.

1222
  KlassDepChange changes(dependee);
D
duke 已提交
1223 1224 1225 1226 1227 1228 1229 1230 1231

  // Compute the dependent nmethods
  if (CodeCache::mark_for_deoptimization(changes) > 0) {
    // At least one nmethod has been marked for deoptimization
    VM_Deoptimize op;
    VMThread::execute(&op);
  }
}

1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245
// Flushes compiled methods dependent on a particular CallSite
// instance when its target is different than the given MethodHandle.
void Universe::flush_dependents_on(Handle call_site, Handle method_handle) {
  assert_lock_strong(Compile_lock);

  if (CodeCache::number_of_nmethods_with_dependencies() == 0) return;

  // CodeCache can only be updated by a thread_in_VM and they will all be
  // stopped dring the safepoint so CodeCache will be safe to update without
  // holding the CodeCache_lock.

  CallSiteDepChange changes(call_site(), method_handle());

  // Compute the dependent nmethods that have a reference to a
1246
  // CallSite object.  We use InstanceKlass::mark_dependent_nmethod
1247
  // directly instead of CodeCache::mark_for_deoptimization because we
1248 1249
  // want dependents on the call site class only not all classes in
  // the ContextStream.
1250 1251 1252
  int marked = 0;
  {
    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
1253
    InstanceKlass* call_site_klass = InstanceKlass::cast(call_site->klass());
1254 1255 1256 1257 1258 1259 1260 1261 1262
    marked = call_site_klass->mark_dependent_nmethods(changes);
  }
  if (marked > 0) {
    // At least one nmethod has been marked for deoptimization
    VM_Deoptimize op;
    VMThread::execute(&op);
  }
}

D
duke 已提交
1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322
#ifdef HOTSWAP
// Flushes compiled methods dependent on dependee in the evolutionary sense
void Universe::flush_evol_dependents_on(instanceKlassHandle ev_k_h) {
  // --- Compile_lock is not held. However we are at a safepoint.
  assert_locked_or_safepoint(Compile_lock);
  if (CodeCache::number_of_nmethods_with_dependencies() == 0) return;

  // CodeCache can only be updated by a thread_in_VM and they will all be
  // stopped dring the safepoint so CodeCache will be safe to update without
  // holding the CodeCache_lock.

  // Compute the dependent nmethods
  if (CodeCache::mark_for_evol_deoptimization(ev_k_h) > 0) {
    // At least one nmethod has been marked for deoptimization

    // All this already happens inside a VM_Operation, so we'll do all the work here.
    // Stuff copied from VM_Deoptimize and modified slightly.

    // We do not want any GCs to happen while we are in the middle of this VM operation
    ResourceMark rm;
    DeoptimizationMarker dm;

    // Deoptimize all activations depending on marked nmethods
    Deoptimization::deoptimize_dependents();

    // Make the dependent methods not entrant (in VM_Deoptimize they are made zombies)
    CodeCache::make_marked_nmethods_not_entrant();
  }
}
#endif // HOTSWAP


// Flushes compiled methods dependent on dependee
void Universe::flush_dependents_on_method(methodHandle m_h) {
  // --- Compile_lock is not held. However we are at a safepoint.
  assert_locked_or_safepoint(Compile_lock);

  // CodeCache can only be updated by a thread_in_VM and they will all be
  // stopped dring the safepoint so CodeCache will be safe to update without
  // holding the CodeCache_lock.

  // Compute the dependent nmethods
  if (CodeCache::mark_for_deoptimization(m_h()) > 0) {
    // At least one nmethod has been marked for deoptimization

    // All this already happens inside a VM_Operation, so we'll do all the work here.
    // Stuff copied from VM_Deoptimize and modified slightly.

    // We do not want any GCs to happen while we are in the middle of this VM operation
    ResourceMark rm;
    DeoptimizationMarker dm;

    // Deoptimize all activations depending on marked nmethods
    Deoptimization::deoptimize_dependents();

    // Make the dependent methods not entrant (in VM_Deoptimize they are made zombies)
    CodeCache::make_marked_nmethods_not_entrant();
  }
}

1323 1324 1325
void Universe::print() {
  print_on(gclog_or_tty);
}
D
duke 已提交
1326

1327
void Universe::print_on(outputStream* st, bool extended) {
D
duke 已提交
1328
  st->print_cr("Heap");
1329 1330 1331 1332 1333
  if (!extended) {
    heap()->print_on(st);
  } else {
    heap()->print_extended_on(st);
  }
D
duke 已提交
1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344
}

void Universe::print_heap_at_SIGBREAK() {
  if (PrintHeapAtSIGBREAK) {
    MutexLocker hl(Heap_lock);
    print_on(tty);
    tty->cr();
    tty->flush();
  }
}

N
never 已提交
1345
void Universe::print_heap_before_gc(outputStream* st, bool ignore_extended) {
D
duke 已提交
1346 1347 1348
  st->print_cr("{Heap before GC invocations=%u (full %u):",
               heap()->total_collections(),
               heap()->total_full_collections());
N
never 已提交
1349
  if (!PrintHeapAtGCExtended || ignore_extended) {
1350 1351 1352 1353
    heap()->print_on(st);
  } else {
    heap()->print_extended_on(st);
  }
D
duke 已提交
1354 1355
}

N
never 已提交
1356
void Universe::print_heap_after_gc(outputStream* st, bool ignore_extended) {
D
duke 已提交
1357 1358 1359
  st->print_cr("Heap after GC invocations=%u (full %u):",
               heap()->total_collections(),
               heap()->total_full_collections());
N
never 已提交
1360
  if (!PrintHeapAtGCExtended || ignore_extended) {
1361 1362 1363 1364
    heap()->print_on(st);
  } else {
    heap()->print_extended_on(st);
  }
D
duke 已提交
1365 1366 1367
  st->print_cr("}");
}

1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414
void Universe::initialize_verify_flags() {
  verify_flags = 0;
  const char delimiter[] = " ,";

  size_t length = strlen(VerifySubSet);
  char* subset_list = NEW_C_HEAP_ARRAY(char, length + 1, mtInternal);
  strncpy(subset_list, VerifySubSet, length + 1);

  char* token = strtok(subset_list, delimiter);
  while (token != NULL) {
    if (strcmp(token, "threads") == 0) {
      verify_flags |= Verify_Threads;
    } else if (strcmp(token, "heap") == 0) {
      verify_flags |= Verify_Heap;
    } else if (strcmp(token, "symbol_table") == 0) {
      verify_flags |= Verify_SymbolTable;
    } else if (strcmp(token, "string_table") == 0) {
      verify_flags |= Verify_StringTable;
    } else if (strcmp(token, "codecache") == 0) {
      verify_flags |= Verify_CodeCache;
    } else if (strcmp(token, "dictionary") == 0) {
      verify_flags |= Verify_SystemDictionary;
    } else if (strcmp(token, "classloader_data_graph") == 0) {
      verify_flags |= Verify_ClassLoaderDataGraph;
    } else if (strcmp(token, "metaspace") == 0) {
      verify_flags |= Verify_MetaspaceAux;
    } else if (strcmp(token, "jni_handles") == 0) {
      verify_flags |= Verify_JNIHandles;
    } else if (strcmp(token, "c-heap") == 0) {
      verify_flags |= Verify_CHeap;
    } else if (strcmp(token, "codecache_oops") == 0) {
      verify_flags |= Verify_CodeCacheOops;
    } else {
      vm_exit_during_initialization(err_msg("VerifySubSet: \'%s\' memory sub-system is unknown, please correct it", token));
    }
    token = strtok(NULL, delimiter);
  }
  FREE_C_HEAP_ARRAY(char, subset_list, mtInternal);
}

bool Universe::should_verify_subset(uint subset) {
  if (verify_flags & subset) {
    return true;
  }
  return false;
}

1415
void Universe::verify(VerifyOption option, const char* prefix, bool silent) {
D
duke 已提交
1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431
  // The use of _verify_in_progress is a temporary work around for
  // 6320749.  Don't bother with a creating a class to set and clear
  // it since it is only used in this method and the control flow is
  // straight forward.
  _verify_in_progress = true;

  COMPILER2_PRESENT(
    assert(!DerivedPointerTable::is_active(),
         "DPT should not be active during verification "
         "(of thread stacks below)");
  )

  ResourceMark rm;
  HandleMark hm;  // Handles created during verification can be zapped
  _verify_count++;

1432
  if (!silent) gclog_or_tty->print("%s", prefix);
D
duke 已提交
1433
  if (!silent) gclog_or_tty->print("[Verifying ");
1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450
  if (should_verify_subset(Verify_Threads)) {
    if (!silent) gclog_or_tty->print("Threads ");
    Threads::verify();
  }
  if (should_verify_subset(Verify_Heap)) {
    if (!silent) gclog_or_tty->print("Heap ");
    heap()->verify(silent, option);
  }
  if (should_verify_subset(Verify_SymbolTable)) {
    if (!silent) gclog_or_tty->print("SymbolTable ");
    SymbolTable::verify();
  }
  if (should_verify_subset(Verify_StringTable)) {
    if (!silent) gclog_or_tty->print("StringTable ");
    StringTable::verify();
  }
  if (should_verify_subset(Verify_CodeCache)) {
D
duke 已提交
1451 1452
  {
    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
1453
    if (!silent) gclog_or_tty->print("CodeCache ");
D
duke 已提交
1454 1455
    CodeCache::verify();
  }
1456 1457 1458 1459 1460
  }
  if (should_verify_subset(Verify_SystemDictionary)) {
    if (!silent) gclog_or_tty->print("SystemDictionary ");
    SystemDictionary::verify();
  }
1461
#ifndef PRODUCT
1462 1463 1464 1465
  if (should_verify_subset(Verify_ClassLoaderDataGraph)) {
    if (!silent) gclog_or_tty->print("ClassLoaderDataGraph ");
    ClassLoaderDataGraph::verify();
  }
1466
#endif
1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482
  if (should_verify_subset(Verify_MetaspaceAux)) {
    if (!silent) gclog_or_tty->print("MetaspaceAux ");
    MetaspaceAux::verify_free_chunks();
  }
  if (should_verify_subset(Verify_JNIHandles)) {
    if (!silent) gclog_or_tty->print("JNIHandles ");
    JNIHandles::verify();
  }
  if (should_verify_subset(Verify_CHeap)) {
    if (!silent) gclog_or_tty->print("C-heap ");
    os::check_heap();
  }
  if (should_verify_subset(Verify_CodeCacheOops)) {
    if (!silent) gclog_or_tty->print("CodeCache Oops ");
    CodeCache::verify_oops();
  }
D
duke 已提交
1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493
  if (!silent) gclog_or_tty->print_cr("]");

  _verify_in_progress = false;
}

// Oop verification (see MacroAssembler::verify_oop)

static uintptr_t _verify_oop_data[2]   = {0, (uintptr_t)-1};
static uintptr_t _verify_klass_data[2] = {0, (uintptr_t)-1};


1494 1495
#ifndef PRODUCT

D
duke 已提交
1496 1497 1498 1499 1500 1501 1502
static void calculate_verify_data(uintptr_t verify_data[2],
                                  HeapWord* low_boundary,
                                  HeapWord* high_boundary) {
  assert(low_boundary < high_boundary, "bad interval");

  // decide which low-order bits we require to be clear:
  size_t alignSize = MinObjAlignmentInBytes;
1503
  size_t min_object_size = CollectedHeap::min_fill_size();
D
duke 已提交
1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567

  // make an inclusive limit:
  uintptr_t max = (uintptr_t)high_boundary - min_object_size*wordSize;
  uintptr_t min = (uintptr_t)low_boundary;
  assert(min < max, "bad interval");
  uintptr_t diff = max ^ min;

  // throw away enough low-order bits to make the diff vanish
  uintptr_t mask = (uintptr_t)(-1);
  while ((mask & diff) != 0)
    mask <<= 1;
  uintptr_t bits = (min & mask);
  assert(bits == (max & mask), "correct mask");
  // check an intermediate value between min and max, just to make sure:
  assert(bits == ((min + (max-min)/2) & mask), "correct mask");

  // require address alignment, too:
  mask |= (alignSize - 1);

  if (!(verify_data[0] == 0 && verify_data[1] == (uintptr_t)-1)) {
    assert(verify_data[0] == mask && verify_data[1] == bits, "mask stability");
  }
  verify_data[0] = mask;
  verify_data[1] = bits;
}

// Oop verification (see MacroAssembler::verify_oop)

uintptr_t Universe::verify_oop_mask() {
  MemRegion m = heap()->reserved_region();
  calculate_verify_data(_verify_oop_data,
                        m.start(),
                        m.end());
  return _verify_oop_data[0];
}



uintptr_t Universe::verify_oop_bits() {
  verify_oop_mask();
  return _verify_oop_data[1];
}

uintptr_t Universe::verify_mark_mask() {
  return markOopDesc::lock_mask_in_place;
}

uintptr_t Universe::verify_mark_bits() {
  intptr_t mask = verify_mark_mask();
  intptr_t bits = (intptr_t)markOopDesc::prototype();
  assert((bits & ~mask) == 0, "no stray header bits");
  return bits;
}
#endif // PRODUCT


void Universe::compute_verify_oop_data() {
  verify_oop_mask();
  verify_oop_bits();
  verify_mark_mask();
  verify_mark_bits();
}


1568
void LatestMethodCache::init(Klass* k, Method* m) {
D
duke 已提交
1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583
  if (!UseSharedSpaces) {
    _klass = k;
  }
#ifndef PRODUCT
  else {
    // sharing initilization should have already set up _klass
    assert(_klass != NULL, "just checking");
  }
#endif

  _method_idnum = m->method_idnum();
  assert(_method_idnum >= 0, "sanity check");
}


1584
Method* LatestMethodCache::get_method() {
M
mullan 已提交
1585
  if (klass() == NULL) return NULL;
1586 1587
  InstanceKlass* ik = InstanceKlass::cast(klass());
  Method* m = ik->method_with_idnum(method_idnum());
D
duke 已提交
1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613
  assert(m != NULL, "sanity check");
  return m;
}


#ifdef ASSERT
// Release dummy object(s) at bottom of heap
bool Universe::release_fullgc_alot_dummy() {
  MutexLocker ml(FullGCALot_lock);
  if (_fullgc_alot_dummy_array != NULL) {
    if (_fullgc_alot_dummy_next >= _fullgc_alot_dummy_array->length()) {
      // No more dummies to release, release entire array instead
      _fullgc_alot_dummy_array = NULL;
      return false;
    }
    if (!UseConcMarkSweepGC) {
      // Release dummy at bottom of old generation
      _fullgc_alot_dummy_array->obj_at_put(_fullgc_alot_dummy_next++, NULL);
    }
    // Release dummy at bottom of permanent generation
    _fullgc_alot_dummy_array->obj_at_put(_fullgc_alot_dummy_next++, NULL);
  }
  return true;
}

#endif // ASSERT