Mon, 03 Jan 2011 14:09:11 -0500
6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
Summary: enhance the error reporting mechanism to help user to fix the problem rather than making it look like a VM error.
Reviewed-by: kvn, kamg
1 /*
2 * Copyright (c) 1997, 2010, 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 */
25 #include "precompiled.hpp"
26 #include "code/icBuffer.hpp"
27 #include "gc_interface/collectedHeap.hpp"
28 #include "interpreter/bytecodes.hpp"
29 #include "memory/universe.hpp"
30 #include "prims/methodHandles.hpp"
31 #include "runtime/handles.inline.hpp"
32 #include "runtime/icache.hpp"
33 #include "runtime/init.hpp"
34 #include "runtime/safepoint.hpp"
35 #include "runtime/sharedRuntime.hpp"
37 // Initialization done by VM thread in vm_init_globals()
38 void check_ThreadShadow();
39 void eventlog_init();
40 void mutex_init();
41 void chunkpool_init();
42 void perfMemory_init();
44 // Initialization done by Java thread in init_globals()
45 void management_init();
46 void bytecodes_init();
47 void classLoader_init();
48 void codeCache_init();
49 void VM_Version_init();
50 void stubRoutines_init1();
51 jint universe_init(); // dependent on codeCache_init and stubRoutines_init
52 void interpreter_init(); // before any methods loaded
53 void invocationCounter_init(); // before any methods loaded
54 void marksweep_init();
55 void accessFlags_init();
56 void templateTable_init();
57 void InterfaceSupport_init();
58 void universe2_init(); // dependent on codeCache_init and stubRoutines_init
59 void referenceProcessor_init();
60 void jni_handles_init();
61 void vmStructs_init();
63 void vtableStubs_init();
64 void InlineCacheBuffer_init();
65 void compilerOracle_init();
66 void compilationPolicy_init();
69 // Initialization after compiler initialization
70 bool universe_post_init(); // must happen after compiler_init
71 void javaClasses_init(); // must happen after vtable initialization
72 void stubRoutines_init2(); // note: StubRoutines need 2-phase init
74 // Do not disable thread-local-storage, as it is important for some
75 // JNI/JVM/JVMTI functions and signal handlers to work properly
76 // during VM shutdown
77 void perfMemory_exit();
78 void ostream_exit();
80 void vm_init_globals() {
81 check_ThreadShadow();
82 basic_types_init();
83 eventlog_init();
84 mutex_init();
85 chunkpool_init();
86 perfMemory_init();
87 }
90 jint init_globals() {
91 HandleMark hm;
92 management_init();
93 bytecodes_init();
94 classLoader_init();
95 codeCache_init();
96 VM_Version_init();
97 stubRoutines_init1();
98 jint status = universe_init(); // dependent on codeCache_init and stubRoutines_init
99 if (status != JNI_OK)
100 return status;
102 interpreter_init(); // before any methods loaded
103 invocationCounter_init(); // before any methods loaded
104 marksweep_init();
105 accessFlags_init();
106 templateTable_init();
107 InterfaceSupport_init();
108 SharedRuntime::generate_stubs();
109 universe2_init(); // dependent on codeCache_init and stubRoutines_init
110 referenceProcessor_init();
111 jni_handles_init();
112 #ifndef VM_STRUCTS_KERNEL
113 vmStructs_init();
114 #endif // VM_STRUCTS_KERNEL
116 vtableStubs_init();
117 InlineCacheBuffer_init();
118 compilerOracle_init();
119 compilationPolicy_init();
120 VMRegImpl::set_regName();
122 if (!universe_post_init()) {
123 return JNI_ERR;
124 }
125 javaClasses_init(); // must happen after vtable initialization
126 stubRoutines_init2(); // note: StubRoutines need 2-phase init
128 // Generate MethodHandles adapters.
129 MethodHandles::generate_adapters();
131 // Although we'd like to, we can't easily do a heap verify
132 // here because the main thread isn't yet a JavaThread, so
133 // its TLAB may not be made parseable from the usual interfaces.
134 if (VerifyBeforeGC && !UseTLAB &&
135 Universe::heap()->total_collections() >= VerifyGCStartAt) {
136 Universe::heap()->prepare_for_verify();
137 Universe::verify(); // make sure we're starting with a clean slate
138 }
140 // All the flags that get adjusted by VM_Version_init and os::init_2
141 // have been set so dump the flags now.
142 if (PrintFlagsFinal) {
143 CommandLineFlags::printFlags();
144 }
146 return JNI_OK;
147 }
150 void exit_globals() {
151 static bool destructorsCalled = false;
152 if (!destructorsCalled) {
153 destructorsCalled = true;
154 perfMemory_exit();
155 if (PrintSafepointStatistics) {
156 // Print the collected safepoint statistics.
157 SafepointSynchronize::print_stat_on_exit();
158 }
159 ostream_exit();
160 }
161 }
164 static bool _init_completed = false;
166 bool is_init_completed() {
167 return _init_completed;
168 }
171 void set_init_completed() {
172 assert(Universe::is_fully_initialized(), "Should have completed initialization");
173 _init_completed = true;
174 }