init.cpp revision 8413:92457dfb91bd
1/*
2 * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#include "precompiled.hpp"
26#include "classfile/stringTable.hpp"
27#include "code/icBuffer.hpp"
28#include "gc/shared/collectedHeap.hpp"
29#include "interpreter/bytecodes.hpp"
30#include "memory/universe.hpp"
31#include "prims/methodHandles.hpp"
32#include "runtime/handles.inline.hpp"
33#include "runtime/icache.hpp"
34#include "runtime/init.hpp"
35#include "runtime/safepoint.hpp"
36#include "runtime/sharedRuntime.hpp"
37#include "services/memTracker.hpp"
38#include "utilities/macros.hpp"
39
40
41// Initialization done by VM thread in vm_init_globals()
42void check_ThreadShadow();
43void eventlog_init();
44void mutex_init();
45void chunkpool_init();
46void perfMemory_init();
47
48// Initialization done by Java thread in init_globals()
49void management_init();
50void bytecodes_init();
51void classLoader_init();
52void compilationPolicy_init();
53void codeCache_init();
54void VM_Version_init();
55void os_init_globals();        // depends on VM_Version_init, before universe_init
56void stubRoutines_init1();
57jint universe_init();          // depends on codeCache_init and stubRoutines_init
58void interpreter_init();       // before any methods loaded
59void invocationCounter_init(); // before any methods loaded
60void marksweep_init();
61void accessFlags_init();
62void templateTable_init();
63void InterfaceSupport_init();
64void universe2_init();  // dependent on codeCache_init and stubRoutines_init, loads primordial classes
65void referenceProcessor_init();
66void jni_handles_init();
67void vmStructs_init();
68
69void vtableStubs_init();
70void InlineCacheBuffer_init();
71void compilerOracle_init();
72void compileBroker_init();
73
74// Initialization after compiler initialization
75bool universe_post_init();  // must happen after compiler_init
76void javaClasses_init();  // must happen after vtable initialization
77void stubRoutines_init2(); // note: StubRoutines need 2-phase init
78
79// Do not disable thread-local-storage, as it is important for some
80// JNI/JVM/JVMTI functions and signal handlers to work properly
81// during VM shutdown
82void perfMemory_exit();
83void ostream_exit();
84
85void vm_init_globals() {
86  check_ThreadShadow();
87  basic_types_init();
88  eventlog_init();
89  mutex_init();
90  chunkpool_init();
91  perfMemory_init();
92}
93
94
95jint init_globals() {
96  HandleMark hm;
97  management_init();
98  bytecodes_init();
99  classLoader_init();
100  compilationPolicy_init();
101  codeCache_init();
102  VM_Version_init();
103  os_init_globals();
104  stubRoutines_init1();
105  jint status = universe_init();  // dependent on codeCache_init and
106                                  // stubRoutines_init1 and metaspace_init.
107  if (status != JNI_OK)
108    return status;
109
110  interpreter_init();  // before any methods loaded
111  invocationCounter_init();  // before any methods loaded
112  marksweep_init();
113  accessFlags_init();
114  templateTable_init();
115  InterfaceSupport_init();
116  SharedRuntime::generate_stubs();
117  universe2_init();  // dependent on codeCache_init and stubRoutines_init1
118  referenceProcessor_init();
119  jni_handles_init();
120#if INCLUDE_VM_STRUCTS
121  vmStructs_init();
122#endif // INCLUDE_VM_STRUCTS
123
124  vtableStubs_init();
125  InlineCacheBuffer_init();
126  compilerOracle_init();
127  compileBroker_init();
128  VMRegImpl::set_regName();
129
130  if (!universe_post_init()) {
131    return JNI_ERR;
132  }
133  javaClasses_init();   // must happen after vtable initialization
134  stubRoutines_init2(); // note: StubRoutines need 2-phase init
135
136#if INCLUDE_NMT
137  // Solaris stack is walkable only after stubRoutines are set up.
138  // On Other platforms, the stack is always walkable.
139  NMT_stack_walkable = true;
140#endif // INCLUDE_NMT
141
142  // All the flags that get adjusted by VM_Version_init and os::init_2
143  // have been set so dump the flags now.
144  if (PrintFlagsFinal) {
145    CommandLineFlags::printFlags(tty, false);
146  }
147
148  return JNI_OK;
149}
150
151
152void exit_globals() {
153  static bool destructorsCalled = false;
154  if (!destructorsCalled) {
155    destructorsCalled = true;
156    perfMemory_exit();
157    if (PrintSafepointStatistics) {
158      // Print the collected safepoint statistics.
159      SafepointSynchronize::print_stat_on_exit();
160    }
161    if (PrintStringTableStatistics) {
162      SymbolTable::dump(tty);
163      StringTable::dump(tty);
164    }
165    ostream_exit();
166  }
167}
168
169
170static bool _init_completed = false;
171
172bool is_init_completed() {
173  return _init_completed;
174}
175
176
177void set_init_completed() {
178  assert(Universe::is_fully_initialized(), "Should have completed initialization");
179  _init_completed = true;
180}
181