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