universe.cpp revision 1879:f95d63e2154a
168349Sobrien/*
2133359Sobrien * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
3133359Sobrien * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4133359Sobrien *
5133359Sobrien * This code is free software; you can redistribute it and/or modify it
6133359Sobrien * under the terms of the GNU General Public License version 2 only, as
7133359Sobrien * published by the Free Software Foundation.
8133359Sobrien *
9133359Sobrien * This code is distributed in the hope that it will be useful, but WITHOUT
10133359Sobrien * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11133359Sobrien * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12133359Sobrien * version 2 for more details (a copy is included in the LICENSE file that
13133359Sobrien * accompanied this code).
14133359Sobrien *
15133359Sobrien * You should have received a copy of the GNU General Public License version
16133359Sobrien * 2 along with this work; if not, write to the Free Software Foundation,
17133359Sobrien * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18133359Sobrien *
19133359Sobrien * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20133359Sobrien * or visit www.oracle.com if you need additional information or have any
21133359Sobrien * questions.
22133359Sobrien *
23133359Sobrien */
24133359Sobrien
25133359Sobrien#include "precompiled.hpp"
26133359Sobrien#include "classfile/classLoader.hpp"
27133359Sobrien#include "classfile/javaClasses.hpp"
28133359Sobrien#include "classfile/symbolTable.hpp"
29133359Sobrien#include "classfile/systemDictionary.hpp"
30133359Sobrien#include "classfile/vmSymbols.hpp"
31133359Sobrien#include "code/codeCache.hpp"
32133359Sobrien#include "code/dependencies.hpp"
33133359Sobrien#include "gc_interface/collectedHeap.inline.hpp"
3468349Sobrien#include "interpreter/interpreter.hpp"
3568349Sobrien#include "memory/cardTableModRefBS.hpp"
3668349Sobrien#include "memory/filemap.hpp"
3768349Sobrien#include "memory/gcLocker.inline.hpp"
3868349Sobrien#include "memory/genCollectedHeap.hpp"
3968349Sobrien#include "memory/genRemSet.hpp"
4068349Sobrien#include "memory/generation.hpp"
4168349Sobrien#include "memory/oopFactory.hpp"
4268349Sobrien#include "memory/permGen.hpp"
4368349Sobrien#include "memory/space.hpp"
4468349Sobrien#include "memory/universe.hpp"
45133359Sobrien#include "memory/universe.inline.hpp"
46133359Sobrien#include "oops/arrayKlassKlass.hpp"
4768349Sobrien#include "oops/compiledICHolderKlass.hpp"
4868349Sobrien#include "oops/constMethodKlass.hpp"
4968349Sobrien#include "oops/constantPoolKlass.hpp"
5068349Sobrien#include "oops/constantPoolOop.hpp"
5168349Sobrien#include "oops/cpCacheKlass.hpp"
5268349Sobrien#include "oops/cpCacheOop.hpp"
5368349Sobrien#include "oops/instanceKlass.hpp"
5468349Sobrien#include "oops/instanceKlassKlass.hpp"
5568349Sobrien#include "oops/instanceRefKlass.hpp"
5668349Sobrien#include "oops/klassKlass.hpp"
57133359Sobrien#include "oops/klassOop.hpp"
5868349Sobrien#include "oops/methodDataKlass.hpp"
5968349Sobrien#include "oops/methodKlass.hpp"
6068349Sobrien#include "oops/objArrayKlassKlass.hpp"
6168349Sobrien#include "oops/oop.inline.hpp"
6268349Sobrien#include "oops/symbolKlass.hpp"
6368349Sobrien#include "oops/typeArrayKlass.hpp"
6468349Sobrien#include "oops/typeArrayKlassKlass.hpp"
6568349Sobrien#include "prims/jvmtiRedefineClassesTrace.hpp"
66133359Sobrien#include "runtime/aprofiler.hpp"
67133359Sobrien#include "runtime/arguments.hpp"
68133359Sobrien#include "runtime/deoptimization.hpp"
69133359Sobrien#include "runtime/fprofiler.hpp"
70133359Sobrien#include "runtime/handles.inline.hpp"
71133359Sobrien#include "runtime/init.hpp"
72133359Sobrien#include "runtime/java.hpp"
7368349Sobrien#include "runtime/javaCalls.hpp"
74133359Sobrien#include "runtime/sharedRuntime.hpp"
75133359Sobrien#include "runtime/synchronizer.hpp"
76133359Sobrien#include "runtime/timer.hpp"
7768349Sobrien#include "runtime/vm_operations.hpp"
78133359Sobrien#include "services/memoryService.hpp"
79110949Sobrien#include "utilities/copy.hpp"
8068349Sobrien#include "utilities/events.hpp"
81133359Sobrien#include "utilities/hashtable.inline.hpp"
8268349Sobrien#include "utilities/preserveException.hpp"
8368349Sobrien#ifdef TARGET_OS_FAMILY_linux
84133359Sobrien# include "thread_linux.inline.hpp"
85133359Sobrien#endif
86133359Sobrien#ifdef TARGET_OS_FAMILY_solaris
87133359Sobrien# include "thread_solaris.inline.hpp"
88133359Sobrien#endif
8968349Sobrien#ifdef TARGET_OS_FAMILY_windows
9068349Sobrien# include "thread_windows.inline.hpp"
9168349Sobrien#endif
9268349Sobrien#ifndef SERIALGC
9368349Sobrien#include "gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.hpp"
9468349Sobrien#include "gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.hpp"
9568349Sobrien#include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
9668349Sobrien#include "gc_implementation/g1/g1CollectorPolicy.hpp"
9768349Sobrien#include "gc_implementation/parallelScavenge/parallelScavengeHeap.hpp"
9868349Sobrien#endif
9968349Sobrien
10068349Sobrien// Known objects
10168349SobrienklassOop Universe::_boolArrayKlassObj                 = NULL;
10284685SobrienklassOop Universe::_byteArrayKlassObj                 = NULL;
10384685SobrienklassOop Universe::_charArrayKlassObj                 = NULL;
10484685SobrienklassOop Universe::_intArrayKlassObj                  = NULL;
10568349SobrienklassOop Universe::_shortArrayKlassObj                = NULL;
10684685SobrienklassOop Universe::_longArrayKlassObj                 = NULL;
10768349SobrienklassOop Universe::_singleArrayKlassObj               = NULL;
10868349SobrienklassOop Universe::_doubleArrayKlassObj               = NULL;
109133359SobrienklassOop Universe::_typeArrayKlassObjs[T_VOID+1]      = { NULL /*, NULL...*/ };
110133359SobrienklassOop Universe::_objectArrayKlassObj               = NULL;
111133359SobrienklassOop Universe::_symbolKlassObj                    = NULL;
112133359SobrienklassOop Universe::_methodKlassObj                    = NULL;
11368349SobrienklassOop Universe::_constMethodKlassObj               = NULL;
11468349SobrienklassOop Universe::_methodDataKlassObj                = NULL;
11568349SobrienklassOop Universe::_klassKlassObj                     = NULL;
11668349SobrienklassOop Universe::_arrayKlassKlassObj                = NULL;
11768349SobrienklassOop Universe::_objArrayKlassKlassObj             = NULL;
11868349SobrienklassOop Universe::_typeArrayKlassKlassObj            = NULL;
11968349SobrienklassOop Universe::_instanceKlassKlassObj             = NULL;
12068349SobrienklassOop Universe::_constantPoolKlassObj              = NULL;
12168349SobrienklassOop Universe::_constantPoolCacheKlassObj         = NULL;
12268349SobrienklassOop Universe::_compiledICHolderKlassObj          = NULL;
12368349SobrienklassOop Universe::_systemObjArrayKlassObj            = NULL;
12468349Sobrienoop Universe::_int_mirror                             = NULL;
12568349Sobrienoop Universe::_float_mirror                           = NULL;
12668349Sobrienoop Universe::_double_mirror                          = NULL;
127133359Sobrienoop Universe::_byte_mirror                            = NULL;
12868349Sobrienoop Universe::_bool_mirror                            = NULL;
12968349Sobrienoop Universe::_char_mirror                            = NULL;
13068349Sobrienoop Universe::_long_mirror                            = NULL;
13168349Sobrienoop Universe::_short_mirror                           = NULL;
13268349Sobrienoop Universe::_void_mirror                            = NULL;
13368349Sobrienoop Universe::_mirrors[T_VOID+1]                      = { NULL /*, NULL...*/ };
13468349Sobrienoop Universe::_main_thread_group                      = NULL;
13568349Sobrienoop Universe::_system_thread_group                    = NULL;
13668349SobrientypeArrayOop Universe::_the_empty_byte_array          = NULL;
13768349SobrientypeArrayOop Universe::_the_empty_short_array         = NULL;
13868349SobrientypeArrayOop Universe::_the_empty_int_array           = NULL;
13968349SobrienobjArrayOop Universe::_the_empty_system_obj_array     = NULL;
14068349SobrienobjArrayOop Universe::_the_empty_class_klass_array    = NULL;
14168349SobrienobjArrayOop Universe::_the_array_interfaces_array     = NULL;
14268349Sobrienoop Universe::_the_null_string                        = NULL;
14368349Sobrienoop Universe::_the_min_jint_string                   = NULL;
14468349SobrienLatestMethodOopCache* Universe::_finalizer_register_cache = NULL;
14568349SobrienLatestMethodOopCache* Universe::_loader_addClass_cache    = NULL;
14668349SobrienActiveMethodOopsCache* Universe::_reflect_invoke_cache    = NULL;
14768349Sobrienoop Universe::_out_of_memory_error_java_heap          = NULL;
14868349Sobrienoop Universe::_out_of_memory_error_perm_gen           = NULL;
14968349Sobrienoop Universe::_out_of_memory_error_array_size         = NULL;
15068349Sobrienoop Universe::_out_of_memory_error_gc_overhead_limit  = NULL;
15168349SobrienobjArrayOop Universe::_preallocated_out_of_memory_error_array = NULL;
15268349Sobrienvolatile jint Universe::_preallocated_out_of_memory_error_avail_count = 0;
15368349Sobrienbool Universe::_verify_in_progress                    = false;
15468349Sobrienoop Universe::_null_ptr_exception_instance            = NULL;
15568349Sobrienoop Universe::_arithmetic_exception_instance          = NULL;
15668349Sobrienoop Universe::_virtual_machine_error_instance         = NULL;
15768349Sobrienoop Universe::_vm_exception                           = NULL;
15868349Sobrienoop Universe::_emptySymbol                            = NULL;
15968349Sobrien
16068349Sobrien// These variables are guarded by FullGCALot_lock.
16168349Sobriendebug_only(objArrayOop Universe::_fullgc_alot_dummy_array = NULL;)
16268349Sobriendebug_only(int Universe::_fullgc_alot_dummy_next      = 0;)
16368349Sobrien
16468349Sobrien
16568349Sobrien// Heap
16668349Sobrienint             Universe::_verify_count = 0;
16768349Sobrien
16868349Sobrienint             Universe::_base_vtable_size = 0;
16968349Sobrienbool            Universe::_bootstrapping = false;
17068349Sobrienbool            Universe::_fully_initialized = false;
17168349Sobrien
17268349Sobriensize_t          Universe::_heap_capacity_at_last_gc;
173133359Sobriensize_t          Universe::_heap_used_at_last_gc = 0;
174133359Sobrien
175133359SobrienCollectedHeap*  Universe::_collectedHeap = NULL;
176133359Sobrien
17768349SobrienNarrowOopStruct Universe::_narrow_oop = { NULL, 0, true };
17868349Sobrien
17968349Sobrien
18068349Sobrienvoid Universe::basic_type_classes_do(void f(klassOop)) {
18168349Sobrien  f(boolArrayKlassObj());
18268349Sobrien  f(byteArrayKlassObj());
18368349Sobrien  f(charArrayKlassObj());
18468349Sobrien  f(intArrayKlassObj());
18568349Sobrien  f(shortArrayKlassObj());
18668349Sobrien  f(longArrayKlassObj());
18768349Sobrien  f(singleArrayKlassObj());
18868349Sobrien  f(doubleArrayKlassObj());
18968349Sobrien}
19068349Sobrien
19168349Sobrien
19268349Sobrienvoid Universe::system_classes_do(void f(klassOop)) {
19368349Sobrien  f(symbolKlassObj());
194133359Sobrien  f(methodKlassObj());
19568349Sobrien  f(constMethodKlassObj());
19668349Sobrien  f(methodDataKlassObj());
19768349Sobrien  f(klassKlassObj());
19868349Sobrien  f(arrayKlassKlassObj());
19968349Sobrien  f(objArrayKlassKlassObj());
20068349Sobrien  f(typeArrayKlassKlassObj());
20168349Sobrien  f(instanceKlassKlassObj());
20268349Sobrien  f(constantPoolKlassObj());
20368349Sobrien  f(systemObjArrayKlassObj());
20468349Sobrien}
20568349Sobrien
20668349Sobrienvoid Universe::oops_do(OopClosure* f, bool do_all) {
20768349Sobrien
20868349Sobrien  f->do_oop((oop*) &_int_mirror);
20968349Sobrien  f->do_oop((oop*) &_float_mirror);
21068349Sobrien  f->do_oop((oop*) &_double_mirror);
21168349Sobrien  f->do_oop((oop*) &_byte_mirror);
21268349Sobrien  f->do_oop((oop*) &_bool_mirror);
21368349Sobrien  f->do_oop((oop*) &_char_mirror);
21468349Sobrien  f->do_oop((oop*) &_long_mirror);
215133359Sobrien  f->do_oop((oop*) &_short_mirror);
216110949Sobrien  f->do_oop((oop*) &_void_mirror);
21768349Sobrien
21868349Sobrien  // It's important to iterate over these guys even if they are null,
21968349Sobrien  // since that's how shared heaps are restored.
22068349Sobrien  for (int i = T_BOOLEAN; i < T_VOID+1; i++) {
22168349Sobrien    f->do_oop((oop*) &_mirrors[i]);
22268349Sobrien  }
22368349Sobrien  assert(_mirrors[0] == NULL && _mirrors[T_BOOLEAN - 1] == NULL, "checking");
22468349Sobrien
22568349Sobrien  // %%% Consider moving those "shared oops" over here with the others.
22668349Sobrien  f->do_oop((oop*)&_boolArrayKlassObj);
22768349Sobrien  f->do_oop((oop*)&_byteArrayKlassObj);
22868349Sobrien  f->do_oop((oop*)&_charArrayKlassObj);
22968349Sobrien  f->do_oop((oop*)&_intArrayKlassObj);
23068349Sobrien  f->do_oop((oop*)&_shortArrayKlassObj);
23168349Sobrien  f->do_oop((oop*)&_longArrayKlassObj);
23268349Sobrien  f->do_oop((oop*)&_singleArrayKlassObj);
23368349Sobrien  f->do_oop((oop*)&_doubleArrayKlassObj);
23468349Sobrien  f->do_oop((oop*)&_objectArrayKlassObj);
23568349Sobrien  {
23668349Sobrien    for (int i = 0; i < T_VOID+1; i++) {
23768349Sobrien      if (_typeArrayKlassObjs[i] != NULL) {
23868349Sobrien        assert(i >= T_BOOLEAN, "checking");
23968349Sobrien        f->do_oop((oop*)&_typeArrayKlassObjs[i]);
24068349Sobrien      } else if (do_all) {
24168349Sobrien        f->do_oop((oop*)&_typeArrayKlassObjs[i]);
24268349Sobrien      }
24368349Sobrien    }
24468349Sobrien  }
24568349Sobrien  f->do_oop((oop*)&_symbolKlassObj);
24668349Sobrien  f->do_oop((oop*)&_methodKlassObj);
24768349Sobrien  f->do_oop((oop*)&_constMethodKlassObj);
248133359Sobrien  f->do_oop((oop*)&_methodDataKlassObj);
24968349Sobrien  f->do_oop((oop*)&_klassKlassObj);
25068349Sobrien  f->do_oop((oop*)&_arrayKlassKlassObj);
25168349Sobrien  f->do_oop((oop*)&_objArrayKlassKlassObj);
25268349Sobrien  f->do_oop((oop*)&_typeArrayKlassKlassObj);
25368349Sobrien  f->do_oop((oop*)&_instanceKlassKlassObj);
25468349Sobrien  f->do_oop((oop*)&_constantPoolKlassObj);
25568349Sobrien  f->do_oop((oop*)&_constantPoolCacheKlassObj);
25668349Sobrien  f->do_oop((oop*)&_compiledICHolderKlassObj);
25768349Sobrien  f->do_oop((oop*)&_systemObjArrayKlassObj);
258133359Sobrien  f->do_oop((oop*)&_the_empty_byte_array);
259133359Sobrien  f->do_oop((oop*)&_the_empty_short_array);
260133359Sobrien  f->do_oop((oop*)&_the_empty_int_array);
261133359Sobrien  f->do_oop((oop*)&_the_empty_system_obj_array);
262133359Sobrien  f->do_oop((oop*)&_the_empty_class_klass_array);
263133359Sobrien  f->do_oop((oop*)&_the_array_interfaces_array);
264133359Sobrien  f->do_oop((oop*)&_the_null_string);
265133359Sobrien  f->do_oop((oop*)&_the_min_jint_string);
26668349Sobrien  _finalizer_register_cache->oops_do(f);
26768349Sobrien  _loader_addClass_cache->oops_do(f);
268133359Sobrien  _reflect_invoke_cache->oops_do(f);
269133359Sobrien  f->do_oop((oop*)&_out_of_memory_error_java_heap);
270133359Sobrien  f->do_oop((oop*)&_out_of_memory_error_perm_gen);
271133359Sobrien  f->do_oop((oop*)&_out_of_memory_error_array_size);
27268349Sobrien  f->do_oop((oop*)&_out_of_memory_error_gc_overhead_limit);
27368349Sobrien  if (_preallocated_out_of_memory_error_array != (oop)NULL) {   // NULL when DumpSharedSpaces
274133359Sobrien    f->do_oop((oop*)&_preallocated_out_of_memory_error_array);
275133359Sobrien  }
27668349Sobrien  f->do_oop((oop*)&_null_ptr_exception_instance);
27768349Sobrien  f->do_oop((oop*)&_arithmetic_exception_instance);
278133359Sobrien  f->do_oop((oop*)&_virtual_machine_error_instance);
279133359Sobrien  f->do_oop((oop*)&_main_thread_group);
280133359Sobrien  f->do_oop((oop*)&_system_thread_group);
281133359Sobrien  f->do_oop((oop*)&_vm_exception);
28268349Sobrien  f->do_oop((oop*)&_emptySymbol);
28368349Sobrien  debug_only(f->do_oop((oop*)&_fullgc_alot_dummy_array);)
284133359Sobrien}
285133359Sobrien
286133359Sobrien
287133359Sobrienvoid Universe::check_alignment(uintx size, uintx alignment, const char* name) {
28868349Sobrien  if (size < alignment || size % alignment != 0) {
28968349Sobrien    ResourceMark rm;
290133359Sobrien    stringStream st;
291133359Sobrien    st.print("Size of %s (%ld bytes) must be aligned to %ld bytes", name, size, alignment);
29268349Sobrien    char* error = st.as_string();
29368349Sobrien    vm_exit_during_initialization(error);
29468349Sobrien  }
29568349Sobrien}
29668349Sobrien
29768349Sobrien
29868349Sobrienvoid Universe::genesis(TRAPS) {
299133359Sobrien  ResourceMark rm;
300133359Sobrien  { FlagSetting fs(_bootstrapping, true);
30168349Sobrien
302133359Sobrien    { MutexLocker mc(Compile_lock);
303133359Sobrien
304133359Sobrien      // determine base vtable size; without that we cannot create the array klasses
305133359Sobrien      compute_base_vtable_size();
30668349Sobrien
307133359Sobrien      if (!UseSharedSpaces) {
308133359Sobrien        _klassKlassObj          = klassKlass::create_klass(CHECK);
30968349Sobrien        _arrayKlassKlassObj     = arrayKlassKlass::create_klass(CHECK);
310133359Sobrien
311133359Sobrien        _objArrayKlassKlassObj  = objArrayKlassKlass::create_klass(CHECK);
31268349Sobrien        _instanceKlassKlassObj  = instanceKlassKlass::create_klass(CHECK);
31368349Sobrien        _typeArrayKlassKlassObj = typeArrayKlassKlass::create_klass(CHECK);
314133359Sobrien
315133359Sobrien        _symbolKlassObj         = symbolKlass::create_klass(CHECK);
31668349Sobrien
317133359Sobrien        _emptySymbol            = oopFactory::new_symbol("", CHECK);
318133359Sobrien
31968349Sobrien        _boolArrayKlassObj      = typeArrayKlass::create_klass(T_BOOLEAN, sizeof(jboolean), CHECK);
32068349Sobrien        _charArrayKlassObj      = typeArrayKlass::create_klass(T_CHAR,    sizeof(jchar),    CHECK);
321133359Sobrien        _singleArrayKlassObj    = typeArrayKlass::create_klass(T_FLOAT,   sizeof(jfloat),   CHECK);
322133359Sobrien        _doubleArrayKlassObj    = typeArrayKlass::create_klass(T_DOUBLE,  sizeof(jdouble),  CHECK);
32368349Sobrien        _byteArrayKlassObj      = typeArrayKlass::create_klass(T_BYTE,    sizeof(jbyte),    CHECK);
324133359Sobrien        _shortArrayKlassObj     = typeArrayKlass::create_klass(T_SHORT,   sizeof(jshort),   CHECK);
325133359Sobrien        _intArrayKlassObj       = typeArrayKlass::create_klass(T_INT,     sizeof(jint),     CHECK);
32668349Sobrien        _longArrayKlassObj      = typeArrayKlass::create_klass(T_LONG,    sizeof(jlong),    CHECK);
32768349Sobrien
328133359Sobrien        _typeArrayKlassObjs[T_BOOLEAN] = _boolArrayKlassObj;
329133359Sobrien        _typeArrayKlassObjs[T_CHAR]    = _charArrayKlassObj;
33068349Sobrien        _typeArrayKlassObjs[T_FLOAT]   = _singleArrayKlassObj;
33168349Sobrien        _typeArrayKlassObjs[T_DOUBLE]  = _doubleArrayKlassObj;
332133359Sobrien        _typeArrayKlassObjs[T_BYTE]    = _byteArrayKlassObj;
333133359Sobrien        _typeArrayKlassObjs[T_SHORT]   = _shortArrayKlassObj;
33468349Sobrien        _typeArrayKlassObjs[T_INT]     = _intArrayKlassObj;
33568349Sobrien        _typeArrayKlassObjs[T_LONG]    = _longArrayKlassObj;
33668349Sobrien
337133359Sobrien        _methodKlassObj             = methodKlass::create_klass(CHECK);
338133359Sobrien        _constMethodKlassObj        = constMethodKlass::create_klass(CHECK);
33968349Sobrien        _methodDataKlassObj         = methodDataKlass::create_klass(CHECK);
340133359Sobrien        _constantPoolKlassObj       = constantPoolKlass::create_klass(CHECK);
341133359Sobrien        _constantPoolCacheKlassObj  = constantPoolCacheKlass::create_klass(CHECK);
34268349Sobrien
34368349Sobrien        _compiledICHolderKlassObj   = compiledICHolderKlass::create_klass(CHECK);
34468349Sobrien        _systemObjArrayKlassObj     = objArrayKlassKlass::cast(objArrayKlassKlassObj())->allocate_system_objArray_klass(CHECK);
34568349Sobrien
34668349Sobrien        _the_empty_byte_array       = oopFactory::new_permanent_byteArray(0, CHECK);
347133359Sobrien        _the_empty_short_array      = oopFactory::new_permanent_shortArray(0, CHECK);
348133359Sobrien        _the_empty_int_array        = oopFactory::new_permanent_intArray(0, CHECK);
34968349Sobrien        _the_empty_system_obj_array = oopFactory::new_system_objArray(0, CHECK);
35068349Sobrien
35168349Sobrien        _the_array_interfaces_array = oopFactory::new_system_objArray(2, CHECK);
35268349Sobrien        _vm_exception               = oopFactory::new_symbol("vm exception holder", CHECK);
35368349Sobrien      } else {
35468349Sobrien        FileMapInfo *mapinfo = FileMapInfo::current_info();
35568349Sobrien        char* buffer = mapinfo->region_base(CompactingPermGenGen::md);
35668349Sobrien        void** vtbl_list = (void**)buffer;
35768349Sobrien        init_self_patching_vtbl_list(vtbl_list,
35868349Sobrien                                     CompactingPermGenGen::vtbl_list_size);
35968349Sobrien      }
36068349Sobrien    }
36168349Sobrien
36268349Sobrien    vmSymbols::initialize(CHECK);
36368349Sobrien
36468349Sobrien    SystemDictionary::initialize(CHECK);
36568349Sobrien
36668349Sobrien    klassOop ok = SystemDictionary::Object_klass();
36768349Sobrien
36868349Sobrien    _the_null_string            = StringTable::intern("null", CHECK);
36968349Sobrien    _the_min_jint_string       = StringTable::intern("-2147483648", CHECK);
37068349Sobrien
37168349Sobrien    if (UseSharedSpaces) {
37268349Sobrien      // Verify shared interfaces array.
37368349Sobrien      assert(_the_array_interfaces_array->obj_at(0) ==
37468349Sobrien             SystemDictionary::Cloneable_klass(), "u3");
37568349Sobrien      assert(_the_array_interfaces_array->obj_at(1) ==
37668349Sobrien             SystemDictionary::Serializable_klass(), "u3");
37768349Sobrien
37868349Sobrien      // Verify element klass for system obj array klass
37968349Sobrien      assert(objArrayKlass::cast(_systemObjArrayKlassObj)->element_klass() == ok, "u1");
38068349Sobrien      assert(objArrayKlass::cast(_systemObjArrayKlassObj)->bottom_klass() == ok, "u2");
38168349Sobrien
38268349Sobrien      // Verify super class for the classes created above
38368349Sobrien      assert(Klass::cast(boolArrayKlassObj()     )->super() == ok, "u3");
38468349Sobrien      assert(Klass::cast(charArrayKlassObj()     )->super() == ok, "u3");
38568349Sobrien      assert(Klass::cast(singleArrayKlassObj()   )->super() == ok, "u3");
38668349Sobrien      assert(Klass::cast(doubleArrayKlassObj()   )->super() == ok, "u3");
38768349Sobrien      assert(Klass::cast(byteArrayKlassObj()     )->super() == ok, "u3");
38868349Sobrien      assert(Klass::cast(shortArrayKlassObj()    )->super() == ok, "u3");
38968349Sobrien      assert(Klass::cast(intArrayKlassObj()      )->super() == ok, "u3");
39068349Sobrien      assert(Klass::cast(longArrayKlassObj()     )->super() == ok, "u3");
39168349Sobrien      assert(Klass::cast(constantPoolKlassObj()  )->super() == ok, "u3");
39268349Sobrien      assert(Klass::cast(systemObjArrayKlassObj())->super() == ok, "u3");
39368349Sobrien    } else {
39468349Sobrien      // Set up shared interfaces array.  (Do this before supers are set up.)
39568349Sobrien      _the_array_interfaces_array->obj_at_put(0, SystemDictionary::Cloneable_klass());
39668349Sobrien      _the_array_interfaces_array->obj_at_put(1, SystemDictionary::Serializable_klass());
39768349Sobrien
39868349Sobrien      // Set element klass for system obj array klass
39968349Sobrien      objArrayKlass::cast(_systemObjArrayKlassObj)->set_element_klass(ok);
40068349Sobrien      objArrayKlass::cast(_systemObjArrayKlassObj)->set_bottom_klass(ok);
40168349Sobrien
40268349Sobrien      // Set super class for the classes created above
40368349Sobrien      Klass::cast(boolArrayKlassObj()     )->initialize_supers(ok, CHECK);
40468349Sobrien      Klass::cast(charArrayKlassObj()     )->initialize_supers(ok, CHECK);
40568349Sobrien      Klass::cast(singleArrayKlassObj()   )->initialize_supers(ok, CHECK);
40668349Sobrien      Klass::cast(doubleArrayKlassObj()   )->initialize_supers(ok, CHECK);
40768349Sobrien      Klass::cast(byteArrayKlassObj()     )->initialize_supers(ok, CHECK);
40868349Sobrien      Klass::cast(shortArrayKlassObj()    )->initialize_supers(ok, CHECK);
40968349Sobrien      Klass::cast(intArrayKlassObj()      )->initialize_supers(ok, CHECK);
41068349Sobrien      Klass::cast(longArrayKlassObj()     )->initialize_supers(ok, CHECK);
41168349Sobrien      Klass::cast(constantPoolKlassObj()  )->initialize_supers(ok, CHECK);
41268349Sobrien      Klass::cast(systemObjArrayKlassObj())->initialize_supers(ok, CHECK);
41368349Sobrien      Klass::cast(boolArrayKlassObj()     )->set_super(ok);
41468349Sobrien      Klass::cast(charArrayKlassObj()     )->set_super(ok);
41568349Sobrien      Klass::cast(singleArrayKlassObj()   )->set_super(ok);
41668349Sobrien      Klass::cast(doubleArrayKlassObj()   )->set_super(ok);
41768349Sobrien      Klass::cast(byteArrayKlassObj()     )->set_super(ok);
41868349Sobrien      Klass::cast(shortArrayKlassObj()    )->set_super(ok);
41968349Sobrien      Klass::cast(intArrayKlassObj()      )->set_super(ok);
420133359Sobrien      Klass::cast(longArrayKlassObj()     )->set_super(ok);
42168349Sobrien      Klass::cast(constantPoolKlassObj()  )->set_super(ok);
42268349Sobrien      Klass::cast(systemObjArrayKlassObj())->set_super(ok);
42368349Sobrien    }
42468349Sobrien
42568349Sobrien    Klass::cast(boolArrayKlassObj()     )->append_to_sibling_list();
42668349Sobrien    Klass::cast(charArrayKlassObj()     )->append_to_sibling_list();
42768349Sobrien    Klass::cast(singleArrayKlassObj()   )->append_to_sibling_list();
42868349Sobrien    Klass::cast(doubleArrayKlassObj()   )->append_to_sibling_list();
42968349Sobrien    Klass::cast(byteArrayKlassObj()     )->append_to_sibling_list();
43068349Sobrien    Klass::cast(shortArrayKlassObj()    )->append_to_sibling_list();
43168349Sobrien    Klass::cast(intArrayKlassObj()      )->append_to_sibling_list();
43268349Sobrien    Klass::cast(longArrayKlassObj()     )->append_to_sibling_list();
43368349Sobrien    Klass::cast(constantPoolKlassObj()  )->append_to_sibling_list();
43468349Sobrien    Klass::cast(systemObjArrayKlassObj())->append_to_sibling_list();
43568349Sobrien  } // end of core bootstrapping
43668349Sobrien
43768349Sobrien  // Initialize _objectArrayKlass after core bootstraping to make
43868349Sobrien  // sure the super class is set up properly for _objectArrayKlass.
43968349Sobrien  _objectArrayKlassObj = instanceKlass::
44068349Sobrien    cast(SystemDictionary::Object_klass())->array_klass(1, CHECK);
44168349Sobrien  // Add the class to the class hierarchy manually to make sure that
442133359Sobrien  // its vtable is initialized after core bootstrapping is completed.
443133359Sobrien  Klass::cast(_objectArrayKlassObj)->append_to_sibling_list();
444133359Sobrien
44568349Sobrien  // Compute is_jdk version flags.
44668349Sobrien  // Only 1.3 or later has the java.lang.Shutdown class.
44768349Sobrien  // Only 1.4 or later has the java.lang.CharSequence interface.
44868349Sobrien  // Only 1.5 or later has the java.lang.management.MemoryUsage class.
44968349Sobrien  if (JDK_Version::is_partially_initialized()) {
45068349Sobrien    uint8_t jdk_version;
45168349Sobrien    klassOop k = SystemDictionary::resolve_or_null(
45268349Sobrien        vmSymbolHandles::java_lang_management_MemoryUsage(), THREAD);
45368349Sobrien    CLEAR_PENDING_EXCEPTION; // ignore exceptions
45468349Sobrien    if (k == NULL) {
45568349Sobrien      k = SystemDictionary::resolve_or_null(
45668349Sobrien          vmSymbolHandles::java_lang_CharSequence(), THREAD);
45768349Sobrien      CLEAR_PENDING_EXCEPTION; // ignore exceptions
45868349Sobrien      if (k == NULL) {
45968349Sobrien        k = SystemDictionary::resolve_or_null(
46068349Sobrien            vmSymbolHandles::java_lang_Shutdown(), THREAD);
46168349Sobrien        CLEAR_PENDING_EXCEPTION; // ignore exceptions
462133359Sobrien        if (k == NULL) {
463133359Sobrien          jdk_version = 2;
46468349Sobrien        } else {
46568349Sobrien          jdk_version = 3;
46668349Sobrien        }
46768349Sobrien      } else {
46868349Sobrien        jdk_version = 4;
46968349Sobrien      }
47068349Sobrien    } else {
47168349Sobrien      jdk_version = 5;
47268349Sobrien    }
47368349Sobrien    JDK_Version::fully_initialize(jdk_version);
47468349Sobrien  }
47568349Sobrien
47668349Sobrien  #ifdef ASSERT
47768349Sobrien  if (FullGCALot) {
47868349Sobrien    // Allocate an array of dummy objects.
47968349Sobrien    // We'd like these to be at the bottom of the old generation,
48068349Sobrien    // so that when we free one and then collect,
481133359Sobrien    // (almost) the whole heap moves
482133359Sobrien    // and we find out if we actually update all the oops correctly.
483133359Sobrien    // But we can't allocate directly in the old generation,
48468349Sobrien    // so we allocate wherever, and hope that the first collection
48568349Sobrien    // moves these objects to the bottom of the old generation.
48668349Sobrien    // We can allocate directly in the permanent generation, so we do.
48768349Sobrien    int size;
48868349Sobrien    if (UseConcMarkSweepGC) {
48968349Sobrien      warning("Using +FullGCALot with concurrent mark sweep gc "
49068349Sobrien              "will not force all objects to relocate");
49168349Sobrien      size = FullGCALotDummies;
49268349Sobrien    } else {
49368349Sobrien      size = FullGCALotDummies * 2;
49468349Sobrien    }
49568349Sobrien    objArrayOop    naked_array = oopFactory::new_system_objArray(size, CHECK);
49668349Sobrien    objArrayHandle dummy_array(THREAD, naked_array);
49768349Sobrien    int i = 0;
49868349Sobrien    while (i < size) {
49968349Sobrien      if (!UseConcMarkSweepGC) {
50068349Sobrien        // Allocate dummy in old generation
501133359Sobrien        oop dummy = instanceKlass::cast(SystemDictionary::Object_klass())->allocate_instance(CHECK);
502133359Sobrien        dummy_array->obj_at_put(i++, dummy);
50368349Sobrien      }
50468349Sobrien      // Allocate dummy in permanent generation
50568349Sobrien      oop dummy = instanceKlass::cast(SystemDictionary::Object_klass())->allocate_permanent_instance(CHECK);
50668349Sobrien      dummy_array->obj_at_put(i++, dummy);
50768349Sobrien    }
50868349Sobrien    {
50968349Sobrien      // Only modify the global variable inside the mutex.
51068349Sobrien      // If we had a race to here, the other dummy_array instances
51168349Sobrien      // and their elements just get dropped on the floor, which is fine.
51268349Sobrien      MutexLocker ml(FullGCALot_lock);
51368349Sobrien      if (_fullgc_alot_dummy_array == NULL) {
51468349Sobrien        _fullgc_alot_dummy_array = dummy_array();
51568349Sobrien      }
51668349Sobrien    }
51768349Sobrien    assert(i == _fullgc_alot_dummy_array->length(), "just checking");
51868349Sobrien  }
51968349Sobrien  #endif
52068349Sobrien}
52168349Sobrien
52268349Sobrien
52368349Sobrienstatic inline void add_vtable(void** list, int* n, Klass* o, int count) {
52468349Sobrien  list[(*n)++] = *(void**)&o->vtbl_value();
52568349Sobrien  guarantee((*n) <= count, "vtable list too small.");
52668349Sobrien}
52768349Sobrien
52868349Sobrien
52968349Sobrienvoid Universe::init_self_patching_vtbl_list(void** list, int count) {
53068349Sobrien  int n = 0;
53168349Sobrien  { klassKlass o;             add_vtable(list, &n, &o, count); }
53268349Sobrien  { arrayKlassKlass o;        add_vtable(list, &n, &o, count); }
53368349Sobrien  { objArrayKlassKlass o;     add_vtable(list, &n, &o, count); }
53468349Sobrien  { instanceKlassKlass o;     add_vtable(list, &n, &o, count); }
53568349Sobrien  { instanceKlass o;          add_vtable(list, &n, &o, count); }
53668349Sobrien  { instanceRefKlass o;       add_vtable(list, &n, &o, count); }
53768349Sobrien  { typeArrayKlassKlass o;    add_vtable(list, &n, &o, count); }
53868349Sobrien  { symbolKlass o;            add_vtable(list, &n, &o, count); }
53968349Sobrien  { typeArrayKlass o;         add_vtable(list, &n, &o, count); }
54068349Sobrien  { methodKlass o;            add_vtable(list, &n, &o, count); }
54168349Sobrien  { constMethodKlass o;       add_vtable(list, &n, &o, count); }
54268349Sobrien  { constantPoolKlass o;      add_vtable(list, &n, &o, count); }
54368349Sobrien  { constantPoolCacheKlass o; add_vtable(list, &n, &o, count); }
54468349Sobrien  { objArrayKlass o;          add_vtable(list, &n, &o, count); }
54568349Sobrien  { methodDataKlass o;        add_vtable(list, &n, &o, count); }
54668349Sobrien  { compiledICHolderKlass o;  add_vtable(list, &n, &o, count); }
54768349Sobrien}
54868349Sobrien
54968349Sobrien
55068349Sobrienclass FixupMirrorClosure: public ObjectClosure {
55168349Sobrien public:
55268349Sobrien  virtual void do_object(oop obj) {
55368349Sobrien    if (obj->is_klass()) {
55468349Sobrien      EXCEPTION_MARK;
55568349Sobrien      KlassHandle k(THREAD, klassOop(obj));
55668349Sobrien      // We will never reach the CATCH below since Exceptions::_throw will cause
55768349Sobrien      // the VM to exit if an exception is thrown during initialization
55868349Sobrien      java_lang_Class::create_mirror(k, CATCH);
55968349Sobrien      // This call unconditionally creates a new mirror for k,
56068349Sobrien      // and links in k's component_mirror field if k is an array.
56168349Sobrien      // If k is an objArray, k's element type must already have
56268349Sobrien      // a mirror.  In other words, this closure must process
563133359Sobrien      // the component type of an objArray k before it processes k.
564133359Sobrien      // This works because the permgen iterator presents arrays
565133359Sobrien      // and their component types in order of creation.
56668349Sobrien    }
56768349Sobrien  }
56868349Sobrien};
56968349Sobrien
57068349Sobrienvoid Universe::initialize_basic_type_mirrors(TRAPS) {
57168349Sobrien  if (UseSharedSpaces) {
57268349Sobrien    assert(_int_mirror != NULL, "already loaded");
57368349Sobrien    assert(_void_mirror == _mirrors[T_VOID], "consistently loaded");
57468349Sobrien  } else {
57568349Sobrien
57668349Sobrien    assert(_int_mirror==NULL, "basic type mirrors already initialized");
57768349Sobrien    _int_mirror     =
57868349Sobrien      java_lang_Class::create_basic_type_mirror("int",    T_INT, CHECK);
57968349Sobrien    _float_mirror   =
58068349Sobrien      java_lang_Class::create_basic_type_mirror("float",  T_FLOAT,   CHECK);
58168349Sobrien    _double_mirror  =
58268349Sobrien      java_lang_Class::create_basic_type_mirror("double", T_DOUBLE,  CHECK);
58368349Sobrien    _byte_mirror    =
58468349Sobrien      java_lang_Class::create_basic_type_mirror("byte",   T_BYTE, CHECK);
58568349Sobrien    _bool_mirror    =
58668349Sobrien      java_lang_Class::create_basic_type_mirror("boolean",T_BOOLEAN, CHECK);
58768349Sobrien    _char_mirror    =
58868349Sobrien      java_lang_Class::create_basic_type_mirror("char",   T_CHAR, CHECK);
58968349Sobrien    _long_mirror    =
59068349Sobrien      java_lang_Class::create_basic_type_mirror("long",   T_LONG, CHECK);
59168349Sobrien    _short_mirror   =
592133359Sobrien      java_lang_Class::create_basic_type_mirror("short",  T_SHORT,   CHECK);
593133359Sobrien    _void_mirror    =
59468349Sobrien      java_lang_Class::create_basic_type_mirror("void",   T_VOID, CHECK);
59568349Sobrien
59668349Sobrien    _mirrors[T_INT]     = _int_mirror;
597110949Sobrien    _mirrors[T_FLOAT]   = _float_mirror;
59868349Sobrien    _mirrors[T_DOUBLE]  = _double_mirror;
59968349Sobrien    _mirrors[T_BYTE]    = _byte_mirror;
60068349Sobrien    _mirrors[T_BOOLEAN] = _bool_mirror;
60168349Sobrien    _mirrors[T_CHAR]    = _char_mirror;
60268349Sobrien    _mirrors[T_LONG]    = _long_mirror;
60368349Sobrien    _mirrors[T_SHORT]   = _short_mirror;
60468349Sobrien    _mirrors[T_VOID]    = _void_mirror;
60568349Sobrien    //_mirrors[T_OBJECT]  = instanceKlass::cast(_object_klass)->java_mirror();
60668349Sobrien    //_mirrors[T_ARRAY]   = instanceKlass::cast(_object_klass)->java_mirror();
60768349Sobrien  }
60868349Sobrien}
60968349Sobrien
61068349Sobrienvoid Universe::fixup_mirrors(TRAPS) {
61168349Sobrien  // Bootstrap problem: all classes gets a mirror (java.lang.Class instance) assigned eagerly,
61268349Sobrien  // but we cannot do that for classes created before java.lang.Class is loaded. Here we simply
61368349Sobrien  // walk over permanent objects created so far (mostly classes) and fixup their mirrors. Note
61468349Sobrien  // that the number of objects allocated at this point is very small.
61568349Sobrien  assert(SystemDictionary::Class_klass_loaded(), "java.lang.Class should be loaded");
61668349Sobrien  FixupMirrorClosure blk;
61768349Sobrien  Universe::heap()->permanent_object_iterate(&blk);
61868349Sobrien}
61968349Sobrien
62068349Sobrien
62168349Sobrienstatic bool has_run_finalizers_on_exit = false;
62268349Sobrien
62368349Sobrienvoid Universe::run_finalizers_on_exit() {
62468349Sobrien  if (has_run_finalizers_on_exit) return;
62568349Sobrien  has_run_finalizers_on_exit = true;
62668349Sobrien
627133359Sobrien  // Called on VM exit. This ought to be run in a separate thread.
62868349Sobrien  if (TraceReferenceGC) tty->print_cr("Callback to run finalizers on exit");
62968349Sobrien  {
63068349Sobrien    PRESERVE_EXCEPTION_MARK;
63168349Sobrien    KlassHandle finalizer_klass(THREAD, SystemDictionary::Finalizer_klass());
63268349Sobrien    JavaValue result(T_VOID);
63368349Sobrien    JavaCalls::call_static(
63468349Sobrien      &result,
63568349Sobrien      finalizer_klass,
63668349Sobrien      vmSymbolHandles::run_finalizers_on_exit_name(),
63768349Sobrien      vmSymbolHandles::void_method_signature(),
63868349Sobrien      THREAD
63968349Sobrien    );
64068349Sobrien    // Ignore any pending exceptions
64168349Sobrien    CLEAR_PENDING_EXCEPTION;
64268349Sobrien  }
64368349Sobrien}
64468349Sobrien
64568349Sobrien
646133359Sobrien// initialize_vtable could cause gc if
64768349Sobrien// 1) we specified true to initialize_vtable and
64868349Sobrien// 2) this ran after gc was enabled
64968349Sobrien// In case those ever change we use handles for oops
65068349Sobrienvoid Universe::reinitialize_vtable_of(KlassHandle k_h, TRAPS) {
65168349Sobrien  // init vtable of k and all subclasses
65268349Sobrien  Klass* ko = k_h()->klass_part();
65368349Sobrien  klassVtable* vt = ko->vtable();
65468349Sobrien  if (vt) vt->initialize_vtable(false, CHECK);
65568349Sobrien  if (ko->oop_is_instance()) {
65668349Sobrien    instanceKlass* ik = (instanceKlass*)ko;
65768349Sobrien    for (KlassHandle s_h(THREAD, ik->subklass()); s_h() != NULL; s_h = (THREAD, s_h()->klass_part()->next_sibling())) {
65868349Sobrien      reinitialize_vtable_of(s_h, CHECK);
65968349Sobrien    }
66068349Sobrien  }
661133359Sobrien}
66268349Sobrien
66368349Sobrien
66468349Sobrienvoid initialize_itable_for_klass(klassOop k, TRAPS) {
66568349Sobrien  instanceKlass::cast(k)->itable()->initialize_itable(false, CHECK);
66668349Sobrien}
66768349Sobrien
66868349Sobrien
66968349Sobrienvoid Universe::reinitialize_itables(TRAPS) {
67068349Sobrien  SystemDictionary::classes_do(initialize_itable_for_klass, CHECK);
67168349Sobrien
67268349Sobrien}
67368349Sobrien
67468349Sobrien
67568349Sobrienbool Universe::on_page_boundary(void* addr) {
67668349Sobrien  return ((uintptr_t) addr) % os::vm_page_size() == 0;
67768349Sobrien}
67868349Sobrien
679133359Sobrien
68068349Sobrienbool Universe::should_fill_in_stack_trace(Handle throwable) {
68168349Sobrien  // never attempt to fill in the stack trace of preallocated errors that do not have
68268349Sobrien  // backtrace. These errors are kept alive forever and may be "re-used" when all
68368349Sobrien  // preallocated errors with backtrace have been consumed. Also need to avoid
684133359Sobrien  // a potential loop which could happen if an out of memory occurs when attempting
685133359Sobrien  // to allocate the backtrace.
68668349Sobrien  return ((throwable() != Universe::_out_of_memory_error_java_heap) &&
68768349Sobrien          (throwable() != Universe::_out_of_memory_error_perm_gen)  &&
68868349Sobrien          (throwable() != Universe::_out_of_memory_error_array_size) &&
68968349Sobrien          (throwable() != Universe::_out_of_memory_error_gc_overhead_limit));
69068349Sobrien}
69168349Sobrien
69268349Sobrien
693oop Universe::gen_out_of_memory_error(oop default_err) {
694  // generate an out of memory error:
695  // - if there is a preallocated error with backtrace available then return it wth
696  //   a filled in stack trace.
697  // - if there are no preallocated errors with backtrace available then return
698  //   an error without backtrace.
699  int next;
700  if (_preallocated_out_of_memory_error_avail_count > 0) {
701    next = (int)Atomic::add(-1, &_preallocated_out_of_memory_error_avail_count);
702    assert(next < (int)PreallocatedOutOfMemoryErrorCount, "avail count is corrupt");
703  } else {
704    next = -1;
705  }
706  if (next < 0) {
707    // all preallocated errors have been used.
708    // return default
709    return default_err;
710  } else {
711    // get the error object at the slot and set set it to NULL so that the
712    // array isn't keeping it alive anymore.
713    oop exc = preallocated_out_of_memory_errors()->obj_at(next);
714    assert(exc != NULL, "slot has been used already");
715    preallocated_out_of_memory_errors()->obj_at_put(next, NULL);
716
717    // use the message from the default error
718    oop msg = java_lang_Throwable::message(default_err);
719    assert(msg != NULL, "no message");
720    java_lang_Throwable::set_message(exc, msg);
721
722    // populate the stack trace and return it.
723    java_lang_Throwable::fill_in_stack_trace_of_preallocated_backtrace(exc);
724    return exc;
725  }
726}
727
728static intptr_t non_oop_bits = 0;
729
730void* Universe::non_oop_word() {
731  // Neither the high bits nor the low bits of this value is allowed
732  // to look like (respectively) the high or low bits of a real oop.
733  //
734  // High and low are CPU-specific notions, but low always includes
735  // the low-order bit.  Since oops are always aligned at least mod 4,
736  // setting the low-order bit will ensure that the low half of the
737  // word will never look like that of a real oop.
738  //
739  // Using the OS-supplied non-memory-address word (usually 0 or -1)
740  // will take care of the high bits, however many there are.
741
742  if (non_oop_bits == 0) {
743    non_oop_bits = (intptr_t)os::non_memory_address_word() | 1;
744  }
745
746  return (void*)non_oop_bits;
747}
748
749jint universe_init() {
750  assert(!Universe::_fully_initialized, "called after initialize_vtables");
751  guarantee(1 << LogHeapWordSize == sizeof(HeapWord),
752         "LogHeapWordSize is incorrect.");
753  guarantee(sizeof(oop) >= sizeof(HeapWord), "HeapWord larger than oop?");
754  guarantee(sizeof(oop) % sizeof(HeapWord) == 0,
755            "oop size is not not a multiple of HeapWord size");
756  TraceTime timer("Genesis", TraceStartupTime);
757  GC_locker::lock();  // do not allow gc during bootstrapping
758  JavaClasses::compute_hard_coded_offsets();
759
760  // Get map info from shared archive file.
761  if (DumpSharedSpaces)
762    UseSharedSpaces = false;
763
764  FileMapInfo* mapinfo = NULL;
765  if (UseSharedSpaces) {
766    mapinfo = NEW_C_HEAP_OBJ(FileMapInfo);
767    memset(mapinfo, 0, sizeof(FileMapInfo));
768
769    // Open the shared archive file, read and validate the header. If
770    // initialization files, shared spaces [UseSharedSpaces] are
771    // disabled and the file is closed.
772
773    if (mapinfo->initialize()) {
774      FileMapInfo::set_current_info(mapinfo);
775    } else {
776      assert(!mapinfo->is_open() && !UseSharedSpaces,
777             "archive file not closed or shared spaces not disabled.");
778    }
779  }
780
781  jint status = Universe::initialize_heap();
782  if (status != JNI_OK) {
783    return status;
784  }
785
786  // We have a heap so create the methodOop caches before
787  // CompactingPermGenGen::initialize_oops() tries to populate them.
788  Universe::_finalizer_register_cache = new LatestMethodOopCache();
789  Universe::_loader_addClass_cache    = new LatestMethodOopCache();
790  Universe::_reflect_invoke_cache     = new ActiveMethodOopsCache();
791
792  if (UseSharedSpaces) {
793
794    // Read the data structures supporting the shared spaces (shared
795    // system dictionary, symbol table, etc.).  After that, access to
796    // the file (other than the mapped regions) is no longer needed, and
797    // the file is closed. Closing the file does not affect the
798    // currently mapped regions.
799
800    CompactingPermGenGen::initialize_oops();
801    mapinfo->close();
802
803  } else {
804    SymbolTable::create_table();
805    StringTable::create_table();
806    ClassLoader::create_package_info_table();
807  }
808
809  return JNI_OK;
810}
811
812// Choose the heap base address and oop encoding mode
813// when compressed oops are used:
814// Unscaled  - Use 32-bits oops without encoding when
815//     NarrowOopHeapBaseMin + heap_size < 4Gb
816// ZeroBased - Use zero based compressed oops with encoding when
817//     NarrowOopHeapBaseMin + heap_size < 32Gb
818// HeapBased - Use compressed oops with heap base + encoding.
819
820// 4Gb
821static const uint64_t NarrowOopHeapMax = (uint64_t(max_juint) + 1);
822// 32Gb
823// OopEncodingHeapMax == NarrowOopHeapMax << LogMinObjAlignmentInBytes;
824
825char* Universe::preferred_heap_base(size_t heap_size, NARROW_OOP_MODE mode) {
826  size_t base = 0;
827#ifdef _LP64
828  if (UseCompressedOops) {
829    assert(mode == UnscaledNarrowOop  ||
830           mode == ZeroBasedNarrowOop ||
831           mode == HeapBasedNarrowOop, "mode is invalid");
832    const size_t total_size = heap_size + HeapBaseMinAddress;
833    // Return specified base for the first request.
834    if (!FLAG_IS_DEFAULT(HeapBaseMinAddress) && (mode == UnscaledNarrowOop)) {
835      base = HeapBaseMinAddress;
836    } else if (total_size <= OopEncodingHeapMax && (mode != HeapBasedNarrowOop)) {
837      if (total_size <= NarrowOopHeapMax && (mode == UnscaledNarrowOop) &&
838          (Universe::narrow_oop_shift() == 0)) {
839        // Use 32-bits oops without encoding and
840        // place heap's top on the 4Gb boundary
841        base = (NarrowOopHeapMax - heap_size);
842      } else {
843        // Can't reserve with NarrowOopShift == 0
844        Universe::set_narrow_oop_shift(LogMinObjAlignmentInBytes);
845        if (mode == UnscaledNarrowOop ||
846            mode == ZeroBasedNarrowOop && total_size <= NarrowOopHeapMax) {
847          // Use zero based compressed oops with encoding and
848          // place heap's top on the 32Gb boundary in case
849          // total_size > 4Gb or failed to reserve below 4Gb.
850          base = (OopEncodingHeapMax - heap_size);
851        }
852      }
853    } else {
854      // Can't reserve below 32Gb.
855      Universe::set_narrow_oop_shift(LogMinObjAlignmentInBytes);
856    }
857    // Set narrow_oop_base and narrow_oop_use_implicit_null_checks
858    // used in ReservedHeapSpace() constructors.
859    // The final values will be set in initialize_heap() below.
860    if (base != 0 && (base + heap_size) <= OopEncodingHeapMax) {
861      // Use zero based compressed oops
862      Universe::set_narrow_oop_base(NULL);
863      // Don't need guard page for implicit checks in indexed
864      // addressing mode with zero based Compressed Oops.
865      Universe::set_narrow_oop_use_implicit_null_checks(true);
866    } else {
867      // Set to a non-NULL value so the ReservedSpace ctor computes
868      // the correct no-access prefix.
869      // The final value will be set in initialize_heap() below.
870      Universe::set_narrow_oop_base((address)NarrowOopHeapMax);
871#ifdef _WIN64
872      if (UseLargePages) {
873        // Cannot allocate guard pages for implicit checks in indexed
874        // addressing mode when large pages are specified on windows.
875        Universe::set_narrow_oop_use_implicit_null_checks(false);
876      }
877#endif //  _WIN64
878    }
879  }
880#endif
881  return (char*)base; // also return NULL (don't care) for 32-bit VM
882}
883
884jint Universe::initialize_heap() {
885
886  if (UseParallelGC) {
887#ifndef SERIALGC
888    Universe::_collectedHeap = new ParallelScavengeHeap();
889#else  // SERIALGC
890    fatal("UseParallelGC not supported in java kernel vm.");
891#endif // SERIALGC
892
893  } else if (UseG1GC) {
894#ifndef SERIALGC
895    G1CollectorPolicy* g1p = new G1CollectorPolicy_BestRegionsFirst();
896    G1CollectedHeap* g1h = new G1CollectedHeap(g1p);
897    Universe::_collectedHeap = g1h;
898#else  // SERIALGC
899    fatal("UseG1GC not supported in java kernel vm.");
900#endif // SERIALGC
901
902  } else {
903    GenCollectorPolicy *gc_policy;
904
905    if (UseSerialGC) {
906      gc_policy = new MarkSweepPolicy();
907    } else if (UseConcMarkSweepGC) {
908#ifndef SERIALGC
909      if (UseAdaptiveSizePolicy) {
910        gc_policy = new ASConcurrentMarkSweepPolicy();
911      } else {
912        gc_policy = new ConcurrentMarkSweepPolicy();
913      }
914#else   // SERIALGC
915    fatal("UseConcMarkSweepGC not supported in java kernel vm.");
916#endif // SERIALGC
917    } else { // default old generation
918      gc_policy = new MarkSweepPolicy();
919    }
920
921    Universe::_collectedHeap = new GenCollectedHeap(gc_policy);
922  }
923
924  jint status = Universe::heap()->initialize();
925  if (status != JNI_OK) {
926    return status;
927  }
928
929#ifdef _LP64
930  if (UseCompressedOops) {
931    // Subtract a page because something can get allocated at heap base.
932    // This also makes implicit null checking work, because the
933    // memory+1 page below heap_base needs to cause a signal.
934    // See needs_explicit_null_check.
935    // Only set the heap base for compressed oops because it indicates
936    // compressed oops for pstack code.
937    if (PrintCompressedOopsMode) {
938      tty->cr();
939      tty->print("heap address: " PTR_FORMAT ", size: " SIZE_FORMAT " MB",
940                 Universe::heap()->base(), Universe::heap()->reserved_region().byte_size()/M);
941    }
942    if ((uint64_t)Universe::heap()->reserved_region().end() > OopEncodingHeapMax) {
943      // Can't reserve heap below 32Gb.
944      Universe::set_narrow_oop_base(Universe::heap()->base() - os::vm_page_size());
945      Universe::set_narrow_oop_shift(LogMinObjAlignmentInBytes);
946      if (PrintCompressedOopsMode) {
947        tty->print(", Compressed Oops with base: "PTR_FORMAT, Universe::narrow_oop_base());
948      }
949    } else {
950      Universe::set_narrow_oop_base(0);
951      if (PrintCompressedOopsMode) {
952        tty->print(", zero based Compressed Oops");
953      }
954#ifdef _WIN64
955      if (!Universe::narrow_oop_use_implicit_null_checks()) {
956        // Don't need guard page for implicit checks in indexed addressing
957        // mode with zero based Compressed Oops.
958        Universe::set_narrow_oop_use_implicit_null_checks(true);
959      }
960#endif //  _WIN64
961      if((uint64_t)Universe::heap()->reserved_region().end() > NarrowOopHeapMax) {
962        // Can't reserve heap below 4Gb.
963        Universe::set_narrow_oop_shift(LogMinObjAlignmentInBytes);
964      } else {
965        Universe::set_narrow_oop_shift(0);
966        if (PrintCompressedOopsMode) {
967          tty->print(", 32-bits Oops");
968        }
969      }
970    }
971    if (PrintCompressedOopsMode) {
972      tty->cr();
973      tty->cr();
974    }
975  }
976  assert(Universe::narrow_oop_base() == (Universe::heap()->base() - os::vm_page_size()) ||
977         Universe::narrow_oop_base() == NULL, "invalid value");
978  assert(Universe::narrow_oop_shift() == LogMinObjAlignmentInBytes ||
979         Universe::narrow_oop_shift() == 0, "invalid value");
980#endif
981
982  // We will never reach the CATCH below since Exceptions::_throw will cause
983  // the VM to exit if an exception is thrown during initialization
984
985  if (UseTLAB) {
986    assert(Universe::heap()->supports_tlab_allocation(),
987           "Should support thread-local allocation buffers");
988    ThreadLocalAllocBuffer::startup_initialization();
989  }
990  return JNI_OK;
991}
992
993// It's the caller's repsonsibility to ensure glitch-freedom
994// (if required).
995void Universe::update_heap_info_at_gc() {
996  _heap_capacity_at_last_gc = heap()->capacity();
997  _heap_used_at_last_gc     = heap()->used();
998}
999
1000
1001
1002void universe2_init() {
1003  EXCEPTION_MARK;
1004  Universe::genesis(CATCH);
1005  // Although we'd like to verify here that the state of the heap
1006  // is good, we can't because the main thread has not yet added
1007  // itself to the threads list (so, using current interfaces
1008  // we can't "fill" its TLAB), unless TLABs are disabled.
1009  if (VerifyBeforeGC && !UseTLAB &&
1010      Universe::heap()->total_collections() >= VerifyGCStartAt) {
1011     Universe::heap()->prepare_for_verify();
1012     Universe::verify();   // make sure we're starting with a clean slate
1013  }
1014}
1015
1016
1017// This function is defined in JVM.cpp
1018extern void initialize_converter_functions();
1019
1020bool universe_post_init() {
1021  assert(!is_init_completed(), "Error: initialization not yet completed!");
1022  Universe::_fully_initialized = true;
1023  EXCEPTION_MARK;
1024  { ResourceMark rm;
1025    Interpreter::initialize();      // needed for interpreter entry points
1026    if (!UseSharedSpaces) {
1027      KlassHandle ok_h(THREAD, SystemDictionary::Object_klass());
1028      Universe::reinitialize_vtable_of(ok_h, CHECK_false);
1029      Universe::reinitialize_itables(CHECK_false);
1030    }
1031  }
1032
1033  klassOop k;
1034  instanceKlassHandle k_h;
1035  if (!UseSharedSpaces) {
1036    // Setup preallocated empty java.lang.Class array
1037    Universe::_the_empty_class_klass_array = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_false);
1038    // Setup preallocated OutOfMemoryError errors
1039    k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_OutOfMemoryError(), true, CHECK_false);
1040    k_h = instanceKlassHandle(THREAD, k);
1041    Universe::_out_of_memory_error_java_heap = k_h->allocate_permanent_instance(CHECK_false);
1042    Universe::_out_of_memory_error_perm_gen = k_h->allocate_permanent_instance(CHECK_false);
1043    Universe::_out_of_memory_error_array_size = k_h->allocate_permanent_instance(CHECK_false);
1044    Universe::_out_of_memory_error_gc_overhead_limit =
1045      k_h->allocate_permanent_instance(CHECK_false);
1046
1047    // Setup preallocated NullPointerException
1048    // (this is currently used for a cheap & dirty solution in compiler exception handling)
1049    k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_NullPointerException(), true, CHECK_false);
1050    Universe::_null_ptr_exception_instance = instanceKlass::cast(k)->allocate_permanent_instance(CHECK_false);
1051    // Setup preallocated ArithmeticException
1052    // (this is currently used for a cheap & dirty solution in compiler exception handling)
1053    k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_ArithmeticException(), true, CHECK_false);
1054    Universe::_arithmetic_exception_instance = instanceKlass::cast(k)->allocate_permanent_instance(CHECK_false);
1055    // Virtual Machine Error for when we get into a situation we can't resolve
1056    k = SystemDictionary::resolve_or_fail(
1057      vmSymbolHandles::java_lang_VirtualMachineError(), true, CHECK_false);
1058    bool linked = instanceKlass::cast(k)->link_class_or_fail(CHECK_false);
1059    if (!linked) {
1060      tty->print_cr("Unable to link/verify VirtualMachineError class");
1061      return false; // initialization failed
1062    }
1063    Universe::_virtual_machine_error_instance =
1064      instanceKlass::cast(k)->allocate_permanent_instance(CHECK_false);
1065  }
1066  if (!DumpSharedSpaces) {
1067    // These are the only Java fields that are currently set during shared space dumping.
1068    // We prefer to not handle this generally, so we always reinitialize these detail messages.
1069    Handle msg = java_lang_String::create_from_str("Java heap space", CHECK_false);
1070    java_lang_Throwable::set_message(Universe::_out_of_memory_error_java_heap, msg());
1071
1072    msg = java_lang_String::create_from_str("PermGen space", CHECK_false);
1073    java_lang_Throwable::set_message(Universe::_out_of_memory_error_perm_gen, msg());
1074
1075    msg = java_lang_String::create_from_str("Requested array size exceeds VM limit", CHECK_false);
1076    java_lang_Throwable::set_message(Universe::_out_of_memory_error_array_size, msg());
1077
1078    msg = java_lang_String::create_from_str("GC overhead limit exceeded", CHECK_false);
1079    java_lang_Throwable::set_message(Universe::_out_of_memory_error_gc_overhead_limit, msg());
1080
1081    msg = java_lang_String::create_from_str("/ by zero", CHECK_false);
1082    java_lang_Throwable::set_message(Universe::_arithmetic_exception_instance, msg());
1083
1084    // Setup the array of errors that have preallocated backtrace
1085    k = Universe::_out_of_memory_error_java_heap->klass();
1086    assert(k->klass_part()->name() == vmSymbols::java_lang_OutOfMemoryError(), "should be out of memory error");
1087    k_h = instanceKlassHandle(THREAD, k);
1088
1089    int len = (StackTraceInThrowable) ? (int)PreallocatedOutOfMemoryErrorCount : 0;
1090    Universe::_preallocated_out_of_memory_error_array = oopFactory::new_objArray(k_h(), len, CHECK_false);
1091    for (int i=0; i<len; i++) {
1092      oop err = k_h->allocate_permanent_instance(CHECK_false);
1093      Handle err_h = Handle(THREAD, err);
1094      java_lang_Throwable::allocate_backtrace(err_h, CHECK_false);
1095      Universe::preallocated_out_of_memory_errors()->obj_at_put(i, err_h());
1096    }
1097    Universe::_preallocated_out_of_memory_error_avail_count = (jint)len;
1098  }
1099
1100
1101  // Setup static method for registering finalizers
1102  // The finalizer klass must be linked before looking up the method, in
1103  // case it needs to get rewritten.
1104  instanceKlass::cast(SystemDictionary::Finalizer_klass())->link_class(CHECK_false);
1105  methodOop m = instanceKlass::cast(SystemDictionary::Finalizer_klass())->find_method(
1106                                  vmSymbols::register_method_name(),
1107                                  vmSymbols::register_method_signature());
1108  if (m == NULL || !m->is_static()) {
1109    THROW_MSG_(vmSymbols::java_lang_NoSuchMethodException(),
1110      "java.lang.ref.Finalizer.register", false);
1111  }
1112  Universe::_finalizer_register_cache->init(
1113    SystemDictionary::Finalizer_klass(), m, CHECK_false);
1114
1115  // Resolve on first use and initialize class.
1116  // Note: No race-condition here, since a resolve will always return the same result
1117
1118  // Setup method for security checks
1119  k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_reflect_Method(), true, CHECK_false);
1120  k_h = instanceKlassHandle(THREAD, k);
1121  k_h->link_class(CHECK_false);
1122  m = k_h->find_method(vmSymbols::invoke_name(), vmSymbols::object_object_array_object_signature());
1123  if (m == NULL || m->is_static()) {
1124    THROW_MSG_(vmSymbols::java_lang_NoSuchMethodException(),
1125      "java.lang.reflect.Method.invoke", false);
1126  }
1127  Universe::_reflect_invoke_cache->init(k_h(), m, CHECK_false);
1128
1129  // Setup method for registering loaded classes in class loader vector
1130  instanceKlass::cast(SystemDictionary::ClassLoader_klass())->link_class(CHECK_false);
1131  m = instanceKlass::cast(SystemDictionary::ClassLoader_klass())->find_method(vmSymbols::addClass_name(), vmSymbols::class_void_signature());
1132  if (m == NULL || m->is_static()) {
1133    THROW_MSG_(vmSymbols::java_lang_NoSuchMethodException(),
1134      "java.lang.ClassLoader.addClass", false);
1135  }
1136  Universe::_loader_addClass_cache->init(
1137    SystemDictionary::ClassLoader_klass(), m, CHECK_false);
1138
1139  // The folowing is initializing converter functions for serialization in
1140  // JVM.cpp. If we clean up the StrictMath code above we may want to find
1141  // a better solution for this as well.
1142  initialize_converter_functions();
1143
1144  // This needs to be done before the first scavenge/gc, since
1145  // it's an input to soft ref clearing policy.
1146  {
1147    MutexLocker x(Heap_lock);
1148    Universe::update_heap_info_at_gc();
1149  }
1150
1151  // ("weak") refs processing infrastructure initialization
1152  Universe::heap()->post_initialize();
1153
1154  GC_locker::unlock();  // allow gc after bootstrapping
1155
1156  MemoryService::set_universe_heap(Universe::_collectedHeap);
1157  return true;
1158}
1159
1160
1161void Universe::compute_base_vtable_size() {
1162  _base_vtable_size = ClassLoader::compute_Object_vtable();
1163}
1164
1165
1166// %%% The Universe::flush_foo methods belong in CodeCache.
1167
1168// Flushes compiled methods dependent on dependee.
1169void Universe::flush_dependents_on(instanceKlassHandle dependee) {
1170  assert_lock_strong(Compile_lock);
1171
1172  if (CodeCache::number_of_nmethods_with_dependencies() == 0) return;
1173
1174  // CodeCache can only be updated by a thread_in_VM and they will all be
1175  // stopped dring the safepoint so CodeCache will be safe to update without
1176  // holding the CodeCache_lock.
1177
1178  DepChange changes(dependee);
1179
1180  // Compute the dependent nmethods
1181  if (CodeCache::mark_for_deoptimization(changes) > 0) {
1182    // At least one nmethod has been marked for deoptimization
1183    VM_Deoptimize op;
1184    VMThread::execute(&op);
1185  }
1186}
1187
1188#ifdef HOTSWAP
1189// Flushes compiled methods dependent on dependee in the evolutionary sense
1190void Universe::flush_evol_dependents_on(instanceKlassHandle ev_k_h) {
1191  // --- Compile_lock is not held. However we are at a safepoint.
1192  assert_locked_or_safepoint(Compile_lock);
1193  if (CodeCache::number_of_nmethods_with_dependencies() == 0) return;
1194
1195  // CodeCache can only be updated by a thread_in_VM and they will all be
1196  // stopped dring the safepoint so CodeCache will be safe to update without
1197  // holding the CodeCache_lock.
1198
1199  // Compute the dependent nmethods
1200  if (CodeCache::mark_for_evol_deoptimization(ev_k_h) > 0) {
1201    // At least one nmethod has been marked for deoptimization
1202
1203    // All this already happens inside a VM_Operation, so we'll do all the work here.
1204    // Stuff copied from VM_Deoptimize and modified slightly.
1205
1206    // We do not want any GCs to happen while we are in the middle of this VM operation
1207    ResourceMark rm;
1208    DeoptimizationMarker dm;
1209
1210    // Deoptimize all activations depending on marked nmethods
1211    Deoptimization::deoptimize_dependents();
1212
1213    // Make the dependent methods not entrant (in VM_Deoptimize they are made zombies)
1214    CodeCache::make_marked_nmethods_not_entrant();
1215  }
1216}
1217#endif // HOTSWAP
1218
1219
1220// Flushes compiled methods dependent on dependee
1221void Universe::flush_dependents_on_method(methodHandle m_h) {
1222  // --- Compile_lock is not held. However we are at a safepoint.
1223  assert_locked_or_safepoint(Compile_lock);
1224
1225  // CodeCache can only be updated by a thread_in_VM and they will all be
1226  // stopped dring the safepoint so CodeCache will be safe to update without
1227  // holding the CodeCache_lock.
1228
1229  // Compute the dependent nmethods
1230  if (CodeCache::mark_for_deoptimization(m_h()) > 0) {
1231    // At least one nmethod has been marked for deoptimization
1232
1233    // All this already happens inside a VM_Operation, so we'll do all the work here.
1234    // Stuff copied from VM_Deoptimize and modified slightly.
1235
1236    // We do not want any GCs to happen while we are in the middle of this VM operation
1237    ResourceMark rm;
1238    DeoptimizationMarker dm;
1239
1240    // Deoptimize all activations depending on marked nmethods
1241    Deoptimization::deoptimize_dependents();
1242
1243    // Make the dependent methods not entrant (in VM_Deoptimize they are made zombies)
1244    CodeCache::make_marked_nmethods_not_entrant();
1245  }
1246}
1247
1248void Universe::print() { print_on(gclog_or_tty); }
1249
1250void Universe::print_on(outputStream* st) {
1251  st->print_cr("Heap");
1252  heap()->print_on(st);
1253}
1254
1255void Universe::print_heap_at_SIGBREAK() {
1256  if (PrintHeapAtSIGBREAK) {
1257    MutexLocker hl(Heap_lock);
1258    print_on(tty);
1259    tty->cr();
1260    tty->flush();
1261  }
1262}
1263
1264void Universe::print_heap_before_gc(outputStream* st) {
1265  st->print_cr("{Heap before GC invocations=%u (full %u):",
1266               heap()->total_collections(),
1267               heap()->total_full_collections());
1268  heap()->print_on(st);
1269}
1270
1271void Universe::print_heap_after_gc(outputStream* st) {
1272  st->print_cr("Heap after GC invocations=%u (full %u):",
1273               heap()->total_collections(),
1274               heap()->total_full_collections());
1275  heap()->print_on(st);
1276  st->print_cr("}");
1277}
1278
1279void Universe::verify(bool allow_dirty, bool silent, bool option) {
1280  if (SharedSkipVerify) {
1281    return;
1282  }
1283
1284  // The use of _verify_in_progress is a temporary work around for
1285  // 6320749.  Don't bother with a creating a class to set and clear
1286  // it since it is only used in this method and the control flow is
1287  // straight forward.
1288  _verify_in_progress = true;
1289
1290  COMPILER2_PRESENT(
1291    assert(!DerivedPointerTable::is_active(),
1292         "DPT should not be active during verification "
1293         "(of thread stacks below)");
1294  )
1295
1296  ResourceMark rm;
1297  HandleMark hm;  // Handles created during verification can be zapped
1298  _verify_count++;
1299
1300  if (!silent) gclog_or_tty->print("[Verifying ");
1301  if (!silent) gclog_or_tty->print("threads ");
1302  Threads::verify();
1303  heap()->verify(allow_dirty, silent, option);
1304
1305  if (!silent) gclog_or_tty->print("syms ");
1306  SymbolTable::verify();
1307  if (!silent) gclog_or_tty->print("strs ");
1308  StringTable::verify();
1309  {
1310    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
1311    if (!silent) gclog_or_tty->print("zone ");
1312    CodeCache::verify();
1313  }
1314  if (!silent) gclog_or_tty->print("dict ");
1315  SystemDictionary::verify();
1316  if (!silent) gclog_or_tty->print("hand ");
1317  JNIHandles::verify();
1318  if (!silent) gclog_or_tty->print("C-heap ");
1319  os::check_heap();
1320  if (!silent) gclog_or_tty->print_cr("]");
1321
1322  _verify_in_progress = false;
1323}
1324
1325// Oop verification (see MacroAssembler::verify_oop)
1326
1327static uintptr_t _verify_oop_data[2]   = {0, (uintptr_t)-1};
1328static uintptr_t _verify_klass_data[2] = {0, (uintptr_t)-1};
1329
1330
1331static void calculate_verify_data(uintptr_t verify_data[2],
1332                                  HeapWord* low_boundary,
1333                                  HeapWord* high_boundary) {
1334  assert(low_boundary < high_boundary, "bad interval");
1335
1336  // decide which low-order bits we require to be clear:
1337  size_t alignSize = MinObjAlignmentInBytes;
1338  size_t min_object_size = CollectedHeap::min_fill_size();
1339
1340  // make an inclusive limit:
1341  uintptr_t max = (uintptr_t)high_boundary - min_object_size*wordSize;
1342  uintptr_t min = (uintptr_t)low_boundary;
1343  assert(min < max, "bad interval");
1344  uintptr_t diff = max ^ min;
1345
1346  // throw away enough low-order bits to make the diff vanish
1347  uintptr_t mask = (uintptr_t)(-1);
1348  while ((mask & diff) != 0)
1349    mask <<= 1;
1350  uintptr_t bits = (min & mask);
1351  assert(bits == (max & mask), "correct mask");
1352  // check an intermediate value between min and max, just to make sure:
1353  assert(bits == ((min + (max-min)/2) & mask), "correct mask");
1354
1355  // require address alignment, too:
1356  mask |= (alignSize - 1);
1357
1358  if (!(verify_data[0] == 0 && verify_data[1] == (uintptr_t)-1)) {
1359    assert(verify_data[0] == mask && verify_data[1] == bits, "mask stability");
1360  }
1361  verify_data[0] = mask;
1362  verify_data[1] = bits;
1363}
1364
1365
1366// Oop verification (see MacroAssembler::verify_oop)
1367#ifndef PRODUCT
1368
1369uintptr_t Universe::verify_oop_mask() {
1370  MemRegion m = heap()->reserved_region();
1371  calculate_verify_data(_verify_oop_data,
1372                        m.start(),
1373                        m.end());
1374  return _verify_oop_data[0];
1375}
1376
1377
1378
1379uintptr_t Universe::verify_oop_bits() {
1380  verify_oop_mask();
1381  return _verify_oop_data[1];
1382}
1383
1384
1385uintptr_t Universe::verify_klass_mask() {
1386  /* $$$
1387  // A klass can never live in the new space.  Since the new and old
1388  // spaces can change size, we must settle for bounds-checking against
1389  // the bottom of the world, plus the smallest possible new and old
1390  // space sizes that may arise during execution.
1391  size_t min_new_size = Universe::new_size();   // in bytes
1392  size_t min_old_size = Universe::old_size();   // in bytes
1393  calculate_verify_data(_verify_klass_data,
1394          (HeapWord*)((uintptr_t)_new_gen->low_boundary + min_new_size + min_old_size),
1395          _perm_gen->high_boundary);
1396                        */
1397  // Why doesn't the above just say that klass's always live in the perm
1398  // gen?  I'll see if that seems to work...
1399  MemRegion permanent_reserved;
1400  switch (Universe::heap()->kind()) {
1401  default:
1402    // ???: What if a CollectedHeap doesn't have a permanent generation?
1403    ShouldNotReachHere();
1404    break;
1405  case CollectedHeap::GenCollectedHeap:
1406  case CollectedHeap::G1CollectedHeap: {
1407    SharedHeap* sh = (SharedHeap*) Universe::heap();
1408    permanent_reserved = sh->perm_gen()->reserved();
1409   break;
1410  }
1411#ifndef SERIALGC
1412  case CollectedHeap::ParallelScavengeHeap: {
1413    ParallelScavengeHeap* psh = (ParallelScavengeHeap*) Universe::heap();
1414    permanent_reserved = psh->perm_gen()->reserved();
1415    break;
1416  }
1417#endif // SERIALGC
1418  }
1419  calculate_verify_data(_verify_klass_data,
1420                        permanent_reserved.start(),
1421                        permanent_reserved.end());
1422
1423  return _verify_klass_data[0];
1424}
1425
1426
1427
1428uintptr_t Universe::verify_klass_bits() {
1429  verify_klass_mask();
1430  return _verify_klass_data[1];
1431}
1432
1433
1434uintptr_t Universe::verify_mark_mask() {
1435  return markOopDesc::lock_mask_in_place;
1436}
1437
1438
1439
1440uintptr_t Universe::verify_mark_bits() {
1441  intptr_t mask = verify_mark_mask();
1442  intptr_t bits = (intptr_t)markOopDesc::prototype();
1443  assert((bits & ~mask) == 0, "no stray header bits");
1444  return bits;
1445}
1446#endif // PRODUCT
1447
1448
1449void Universe::compute_verify_oop_data() {
1450  verify_oop_mask();
1451  verify_oop_bits();
1452  verify_mark_mask();
1453  verify_mark_bits();
1454  verify_klass_mask();
1455  verify_klass_bits();
1456}
1457
1458
1459void CommonMethodOopCache::init(klassOop k, methodOop m, TRAPS) {
1460  if (!UseSharedSpaces) {
1461    _klass = k;
1462  }
1463#ifndef PRODUCT
1464  else {
1465    // sharing initilization should have already set up _klass
1466    assert(_klass != NULL, "just checking");
1467  }
1468#endif
1469
1470  _method_idnum = m->method_idnum();
1471  assert(_method_idnum >= 0, "sanity check");
1472}
1473
1474
1475ActiveMethodOopsCache::~ActiveMethodOopsCache() {
1476  if (_prev_methods != NULL) {
1477    for (int i = _prev_methods->length() - 1; i >= 0; i--) {
1478      jweak method_ref = _prev_methods->at(i);
1479      if (method_ref != NULL) {
1480        JNIHandles::destroy_weak_global(method_ref);
1481      }
1482    }
1483    delete _prev_methods;
1484    _prev_methods = NULL;
1485  }
1486}
1487
1488
1489void ActiveMethodOopsCache::add_previous_version(const methodOop method) {
1490  assert(Thread::current()->is_VM_thread(),
1491    "only VMThread can add previous versions");
1492
1493  if (_prev_methods == NULL) {
1494    // This is the first previous version so make some space.
1495    // Start with 2 elements under the assumption that the class
1496    // won't be redefined much.
1497    _prev_methods = new (ResourceObj::C_HEAP) GrowableArray<jweak>(2, true);
1498  }
1499
1500  // RC_TRACE macro has an embedded ResourceMark
1501  RC_TRACE(0x00000100,
1502    ("add: %s(%s): adding prev version ref for cached method @%d",
1503    method->name()->as_C_string(), method->signature()->as_C_string(),
1504    _prev_methods->length()));
1505
1506  methodHandle method_h(method);
1507  jweak method_ref = JNIHandles::make_weak_global(method_h);
1508  _prev_methods->append(method_ref);
1509
1510  // Using weak references allows previous versions of the cached
1511  // method to be GC'ed when they are no longer needed. Since the
1512  // caller is the VMThread and we are at a safepoint, this is a good
1513  // time to clear out unused weak references.
1514
1515  for (int i = _prev_methods->length() - 1; i >= 0; i--) {
1516    jweak method_ref = _prev_methods->at(i);
1517    assert(method_ref != NULL, "weak method ref was unexpectedly cleared");
1518    if (method_ref == NULL) {
1519      _prev_methods->remove_at(i);
1520      // Since we are traversing the array backwards, we don't have to
1521      // do anything special with the index.
1522      continue;  // robustness
1523    }
1524
1525    methodOop m = (methodOop)JNIHandles::resolve(method_ref);
1526    if (m == NULL) {
1527      // this method entry has been GC'ed so remove it
1528      JNIHandles::destroy_weak_global(method_ref);
1529      _prev_methods->remove_at(i);
1530    } else {
1531      // RC_TRACE macro has an embedded ResourceMark
1532      RC_TRACE(0x00000400, ("add: %s(%s): previous cached method @%d is alive",
1533        m->name()->as_C_string(), m->signature()->as_C_string(), i));
1534    }
1535  }
1536} // end add_previous_version()
1537
1538
1539bool ActiveMethodOopsCache::is_same_method(const methodOop method) const {
1540  instanceKlass* ik = instanceKlass::cast(klass());
1541  methodOop check_method = ik->method_with_idnum(method_idnum());
1542  assert(check_method != NULL, "sanity check");
1543  if (check_method == method) {
1544    // done with the easy case
1545    return true;
1546  }
1547
1548  if (_prev_methods != NULL) {
1549    // The cached method has been redefined at least once so search
1550    // the previous versions for a match.
1551    for (int i = 0; i < _prev_methods->length(); i++) {
1552      jweak method_ref = _prev_methods->at(i);
1553      assert(method_ref != NULL, "weak method ref was unexpectedly cleared");
1554      if (method_ref == NULL) {
1555        continue;  // robustness
1556      }
1557
1558      check_method = (methodOop)JNIHandles::resolve(method_ref);
1559      if (check_method == method) {
1560        // a previous version matches
1561        return true;
1562      }
1563    }
1564  }
1565
1566  // either no previous versions or no previous version matched
1567  return false;
1568}
1569
1570
1571methodOop LatestMethodOopCache::get_methodOop() {
1572  instanceKlass* ik = instanceKlass::cast(klass());
1573  methodOop m = ik->method_with_idnum(method_idnum());
1574  assert(m != NULL, "sanity check");
1575  return m;
1576}
1577
1578
1579#ifdef ASSERT
1580// Release dummy object(s) at bottom of heap
1581bool Universe::release_fullgc_alot_dummy() {
1582  MutexLocker ml(FullGCALot_lock);
1583  if (_fullgc_alot_dummy_array != NULL) {
1584    if (_fullgc_alot_dummy_next >= _fullgc_alot_dummy_array->length()) {
1585      // No more dummies to release, release entire array instead
1586      _fullgc_alot_dummy_array = NULL;
1587      return false;
1588    }
1589    if (!UseConcMarkSweepGC) {
1590      // Release dummy at bottom of old generation
1591      _fullgc_alot_dummy_array->obj_at_put(_fullgc_alot_dummy_next++, NULL);
1592    }
1593    // Release dummy at bottom of permanent generation
1594    _fullgc_alot_dummy_array->obj_at_put(_fullgc_alot_dummy_next++, NULL);
1595  }
1596  return true;
1597}
1598
1599#endif // ASSERT
1600