annotate src/share/vm/runtime/java.cpp @ 6862:8a5ea0a9ccc4

7127708: G1: change task num types from int to uint in concurrent mark Summary: Change the type of various task num fields, parameters etc to unsigned and rename them to be more consistent with the other collectors. Code changes were also reviewed by Vitaly Davidovich. Reviewed-by: johnc Contributed-by: Kaushik Srenevasan <kaushik@twitter.com>
author johnc
date Sat, 06 Oct 2012 01:17:44 -0700
parents 9a86ddfc6c8f
children a1b8cf9cf970
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1547
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1547
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1547
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
26 #include "classfile/classLoader.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
27 #include "classfile/symbolTable.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
28 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
29 #include "code/codeCache.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
30 #include "compiler/compileBroker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
31 #include "compiler/compilerOracle.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
32 #include "interpreter/bytecodeHistogram.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
33 #include "memory/genCollectedHeap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
34 #include "memory/oopFactory.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
35 #include "memory/universe.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
36 #include "oops/constantPool.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
37 #include "oops/generateOopMap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
38 #include "oops/instanceKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
39 #include "oops/instanceOop.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
40 #include "oops/method.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
41 #include "oops/objArrayOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
42 #include "oops/oop.inline.hpp"
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2129
diff changeset
43 #include "oops/symbol.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
44 #include "prims/jvmtiExport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
45 #include "runtime/aprofiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
46 #include "runtime/arguments.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
47 #include "runtime/biasedLocking.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
48 #include "runtime/compilationPolicy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
49 #include "runtime/fprofiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
50 #include "runtime/init.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
51 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
52 #include "runtime/java.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
53 #include "runtime/memprofiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
54 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
55 #include "runtime/statSampler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
56 #include "runtime/task.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
57 #include "runtime/timer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
58 #include "runtime/vm_operations.hpp"
6770
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
59 #include "services/memReporter.hpp"
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
60 #include "services/memTracker.hpp"
4800
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4006
diff changeset
61 #include "trace/tracing.hpp"
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4006
diff changeset
62 #include "trace/traceEventTypes.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
63 #include "utilities/dtrace.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
64 #include "utilities/globalDefinitions.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
65 #include "utilities/histogram.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
66 #include "utilities/vmError.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
67 #ifdef TARGET_ARCH_x86
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
68 # include "vm_version_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
69 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
70 #ifdef TARGET_ARCH_sparc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
71 # include "vm_version_sparc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
72 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
73 #ifdef TARGET_ARCH_zero
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
74 # include "vm_version_zero.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
75 #endif
2192
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
76 #ifdef TARGET_ARCH_arm
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
77 # include "vm_version_arm.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
78 #endif
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
79 #ifdef TARGET_ARCH_ppc
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
80 # include "vm_version_ppc.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
81 #endif
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
82 #ifdef TARGET_OS_FAMILY_linux
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
83 # include "thread_linux.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
84 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
85 #ifdef TARGET_OS_FAMILY_solaris
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
86 # include "thread_solaris.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
87 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
88 #ifdef TARGET_OS_FAMILY_windows
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
89 # include "thread_windows.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
90 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3917
diff changeset
91 #ifdef TARGET_OS_FAMILY_bsd
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3917
diff changeset
92 # include "thread_bsd.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3917
diff changeset
93 #endif
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
94 #ifndef SERIALGC
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
95 #include "gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
96 #include "gc_implementation/parallelScavenge/psScavenge.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
97 #include "gc_implementation/parallelScavenge/psScavenge.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
98 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
99 #ifdef COMPILER1
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
100 #include "c1/c1_Compiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
101 #include "c1/c1_Runtime1.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
102 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
103 #ifdef COMPILER2
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
104 #include "code/compiledIC.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
105 #include "compiler/methodLiveness.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
106 #include "opto/compile.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
107 #include "opto/indexSet.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
108 #include "opto/runtime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
109 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
110
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
111 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
112 HS_DTRACE_PROBE_DECL(hotspot, vm__shutdown);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
113 #endif /* !USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // Statistics printing (method invocation histogram)
a61af66fc99e Initial load
duke
parents:
diff changeset
118
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
119 GrowableArray<Method*>* collected_invoked_methods;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
120
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
121 void collect_invoked_methods(Method* m) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
122 if (m->invocation_count() + m->compiled_invocation_count() >= 1 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
123 collected_invoked_methods->push(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
124 }
a61af66fc99e Initial load
duke
parents:
diff changeset
125 }
a61af66fc99e Initial load
duke
parents:
diff changeset
126
a61af66fc99e Initial load
duke
parents:
diff changeset
127
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
128 GrowableArray<Method*>* collected_profiled_methods;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
129
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
130 void collect_profiled_methods(Method* m) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
131 Thread* thread = Thread::current();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
132 // This HandleMark prevents a huge amount of handles from being added
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
133 // to the metadata_handles() array on the thread.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
134 HandleMark hm(thread);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
135 methodHandle mh(thread, m);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
136 if ((m->method_data() != NULL) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
137 (PrintMethodData || CompilerOracle::should_print(mh))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
138 collected_profiled_methods->push(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
139 }
a61af66fc99e Initial load
duke
parents:
diff changeset
140 }
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
143 int compare_methods(Method** a, Method** b) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // %%% there can be 32-bit overflow here
a61af66fc99e Initial load
duke
parents:
diff changeset
145 return ((*b)->invocation_count() + (*b)->compiled_invocation_count())
a61af66fc99e Initial load
duke
parents:
diff changeset
146 - ((*a)->invocation_count() + (*a)->compiled_invocation_count());
a61af66fc99e Initial load
duke
parents:
diff changeset
147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149
a61af66fc99e Initial load
duke
parents:
diff changeset
150 void print_method_invocation_histogram() {
a61af66fc99e Initial load
duke
parents:
diff changeset
151 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
152 HandleMark hm;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
153 collected_invoked_methods = new GrowableArray<Method*>(1024);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
154 SystemDictionary::methods_do(collect_invoked_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
155 collected_invoked_methods->sort(&compare_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
156 //
a61af66fc99e Initial load
duke
parents:
diff changeset
157 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
158 tty->print_cr("Histogram Over MethodOop Invocation Counters (cutoff = %d):", MethodHistogramCutoff);
a61af66fc99e Initial load
duke
parents:
diff changeset
159 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
160 tty->print_cr("____Count_(I+C)____Method________________________Module_________________");
a61af66fc99e Initial load
duke
parents:
diff changeset
161 unsigned total = 0, int_total = 0, comp_total = 0, static_total = 0, final_total = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
162 synch_total = 0, nativ_total = 0, acces_total = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
163 for (int index = 0; index < collected_invoked_methods->length(); index++) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
164 Method* m = collected_invoked_methods->at(index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
165 int c = m->invocation_count() + m->compiled_invocation_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
166 if (c >= MethodHistogramCutoff) m->print_invocation_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
167 int_total += m->invocation_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
168 comp_total += m->compiled_invocation_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
169 if (m->is_final()) final_total += c;
a61af66fc99e Initial load
duke
parents:
diff changeset
170 if (m->is_static()) static_total += c;
a61af66fc99e Initial load
duke
parents:
diff changeset
171 if (m->is_synchronized()) synch_total += c;
a61af66fc99e Initial load
duke
parents:
diff changeset
172 if (m->is_native()) nativ_total += c;
a61af66fc99e Initial load
duke
parents:
diff changeset
173 if (m->is_accessor()) acces_total += c;
a61af66fc99e Initial load
duke
parents:
diff changeset
174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
175 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
176 total = int_total + comp_total;
a61af66fc99e Initial load
duke
parents:
diff changeset
177 tty->print_cr("Invocations summary:");
a61af66fc99e Initial load
duke
parents:
diff changeset
178 tty->print_cr("\t%9d (%4.1f%%) interpreted", int_total, 100.0 * int_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
179 tty->print_cr("\t%9d (%4.1f%%) compiled", comp_total, 100.0 * comp_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
180 tty->print_cr("\t%9d (100%%) total", total);
a61af66fc99e Initial load
duke
parents:
diff changeset
181 tty->print_cr("\t%9d (%4.1f%%) synchronized", synch_total, 100.0 * synch_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
182 tty->print_cr("\t%9d (%4.1f%%) final", final_total, 100.0 * final_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
183 tty->print_cr("\t%9d (%4.1f%%) static", static_total, 100.0 * static_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
184 tty->print_cr("\t%9d (%4.1f%%) native", nativ_total, 100.0 * nativ_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
185 tty->print_cr("\t%9d (%4.1f%%) accessor", acces_total, 100.0 * acces_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
186 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
187 SharedRuntime::print_call_statistics(comp_total);
a61af66fc99e Initial load
duke
parents:
diff changeset
188 }
a61af66fc99e Initial load
duke
parents:
diff changeset
189
a61af66fc99e Initial load
duke
parents:
diff changeset
190 void print_method_profiling_data() {
a61af66fc99e Initial load
duke
parents:
diff changeset
191 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
192 HandleMark hm;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
193 collected_profiled_methods = new GrowableArray<Method*>(1024);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
194 SystemDictionary::methods_do(collect_profiled_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
195 collected_profiled_methods->sort(&compare_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 int count = collected_profiled_methods->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
198 if (count > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
199 for (int index = 0; index < count; index++) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
200 Method* m = collected_profiled_methods->at(index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
201 ttyLocker ttyl;
a61af66fc99e Initial load
duke
parents:
diff changeset
202 tty->print_cr("------------------------------------------------------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
203 //m->print_name(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
204 m->print_invocation_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
205 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
206 m->print_codes();
a61af66fc99e Initial load
duke
parents:
diff changeset
207 }
a61af66fc99e Initial load
duke
parents:
diff changeset
208 tty->print_cr("------------------------------------------------------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
209 }
a61af66fc99e Initial load
duke
parents:
diff changeset
210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
211
a61af66fc99e Initial load
duke
parents:
diff changeset
212 void print_bytecode_count() {
a61af66fc99e Initial load
duke
parents:
diff changeset
213 if (CountBytecodes || TraceBytecodes || StopInterpreterAt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
214 tty->print_cr("[BytecodeCounter::counter_value = %d]", BytecodeCounter::counter_value());
a61af66fc99e Initial load
duke
parents:
diff changeset
215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 AllocStats alloc_stats;
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222 // General statistics printing (profiling ...)
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224 void print_statistics() {
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228 if (CountRuntimeCalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
229 extern Histogram *RuntimeHistogram;
a61af66fc99e Initial load
duke
parents:
diff changeset
230 RuntimeHistogram->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
231 }
a61af66fc99e Initial load
duke
parents:
diff changeset
232
a61af66fc99e Initial load
duke
parents:
diff changeset
233 if (CountJNICalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
234 extern Histogram *JNIHistogram;
a61af66fc99e Initial load
duke
parents:
diff changeset
235 JNIHistogram->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
236 }
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238 if (CountJVMCalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
239 extern Histogram *JVMHistogram;
a61af66fc99e Initial load
duke
parents:
diff changeset
240 JVMHistogram->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
244
a61af66fc99e Initial load
duke
parents:
diff changeset
245 if (MemProfiling) {
a61af66fc99e Initial load
duke
parents:
diff changeset
246 MemProfiler::disengage();
a61af66fc99e Initial load
duke
parents:
diff changeset
247 }
a61af66fc99e Initial load
duke
parents:
diff changeset
248
a61af66fc99e Initial load
duke
parents:
diff changeset
249 if (CITime) {
a61af66fc99e Initial load
duke
parents:
diff changeset
250 CompileBroker::print_times();
a61af66fc99e Initial load
duke
parents:
diff changeset
251 }
a61af66fc99e Initial load
duke
parents:
diff changeset
252
a61af66fc99e Initial load
duke
parents:
diff changeset
253 #ifdef COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
254 if ((PrintC1Statistics || LogVMOutput || LogCompilation) && UseCompiler) {
a61af66fc99e Initial load
duke
parents:
diff changeset
255 FlagSetting fs(DisplayVMOutput, DisplayVMOutput && PrintC1Statistics);
a61af66fc99e Initial load
duke
parents:
diff changeset
256 Runtime1::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
257 Deoptimization::print_statistics();
3841
0f34fdee809e 7071427: AdapterFingerPrint can hold 8 entries per int
never
parents: 3769
diff changeset
258 SharedRuntime::print_statistics();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
259 nmethod::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
260 }
a61af66fc99e Initial load
duke
parents:
diff changeset
261 #endif /* COMPILER1 */
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
264 if ((PrintOptoStatistics || LogVMOutput || LogCompilation) && UseCompiler) {
a61af66fc99e Initial load
duke
parents:
diff changeset
265 FlagSetting fs(DisplayVMOutput, DisplayVMOutput && PrintOptoStatistics);
a61af66fc99e Initial load
duke
parents:
diff changeset
266 Compile::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
267 #ifndef COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
268 Deoptimization::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
269 nmethod::print_statistics();
3841
0f34fdee809e 7071427: AdapterFingerPrint can hold 8 entries per int
never
parents: 3769
diff changeset
270 SharedRuntime::print_statistics();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
271 #endif //COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
272 os::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
274
a61af66fc99e Initial load
duke
parents:
diff changeset
275 if (PrintLockStatistics || PrintPreciseBiasedLockingStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
276 OptoRuntime::print_named_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
277 }
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 if (TimeLivenessAnalysis) {
a61af66fc99e Initial load
duke
parents:
diff changeset
280 MethodLiveness::print_times();
a61af66fc99e Initial load
duke
parents:
diff changeset
281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
282 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
283 if (CollectIndexSetStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
284 IndexSet::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
286 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
287 #endif // COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
288 if (CountCompiledCalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
289 print_method_invocation_histogram();
a61af66fc99e Initial load
duke
parents:
diff changeset
290 }
1918
34bd82eba3bb 6997456: Not possible to build just compiler2
iveresov
parents: 1783
diff changeset
291 if (ProfileInterpreter COMPILER1_PRESENT(|| C1UpdateMethodData)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
292 print_method_profiling_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
294 if (TimeCompiler) {
a61af66fc99e Initial load
duke
parents:
diff changeset
295 COMPILER2_PRESENT(Compile::print_timers();)
a61af66fc99e Initial load
duke
parents:
diff changeset
296 }
a61af66fc99e Initial load
duke
parents:
diff changeset
297 if (TimeCompilationPolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
298 CompilationPolicy::policy()->print_time();
a61af66fc99e Initial load
duke
parents:
diff changeset
299 }
a61af66fc99e Initial load
duke
parents:
diff changeset
300 if (TimeOopMap) {
a61af66fc99e Initial load
duke
parents:
diff changeset
301 GenerateOopMap::print_time();
a61af66fc99e Initial load
duke
parents:
diff changeset
302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
303 if (ProfilerCheckIntervals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
304 PeriodicTask::print_intervals();
a61af66fc99e Initial load
duke
parents:
diff changeset
305 }
a61af66fc99e Initial load
duke
parents:
diff changeset
306 if (PrintSymbolTableSizeHistogram) {
a61af66fc99e Initial load
duke
parents:
diff changeset
307 SymbolTable::print_histogram();
a61af66fc99e Initial load
duke
parents:
diff changeset
308 }
a61af66fc99e Initial load
duke
parents:
diff changeset
309 if (CountBytecodes || TraceBytecodes || StopInterpreterAt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
310 BytecodeCounter::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
311 }
a61af66fc99e Initial load
duke
parents:
diff changeset
312 if (PrintBytecodePairHistogram) {
a61af66fc99e Initial load
duke
parents:
diff changeset
313 BytecodePairHistogram::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
315
a61af66fc99e Initial load
duke
parents:
diff changeset
316 if (PrintCodeCache) {
a61af66fc99e Initial load
duke
parents:
diff changeset
317 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
318 CodeCache::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
319 }
a61af66fc99e Initial load
duke
parents:
diff changeset
320
a61af66fc99e Initial load
duke
parents:
diff changeset
321 if (PrintCodeCache2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
322 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
323 CodeCache::print_internals();
a61af66fc99e Initial load
duke
parents:
diff changeset
324 }
a61af66fc99e Initial load
duke
parents:
diff changeset
325
a61af66fc99e Initial load
duke
parents:
diff changeset
326 if (PrintClassStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
327 SystemDictionary::print_class_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
328 }
a61af66fc99e Initial load
duke
parents:
diff changeset
329 if (PrintMethodStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
330 SystemDictionary::print_method_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
331 }
a61af66fc99e Initial load
duke
parents:
diff changeset
332
a61af66fc99e Initial load
duke
parents:
diff changeset
333 if (PrintVtableStats) {
a61af66fc99e Initial load
duke
parents:
diff changeset
334 klassVtable::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
335 klassItable::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
336 }
a61af66fc99e Initial load
duke
parents:
diff changeset
337 if (VerifyOops) {
a61af66fc99e Initial load
duke
parents:
diff changeset
338 tty->print_cr("+VerifyOops count: %d", StubRoutines::verify_oop_count());
a61af66fc99e Initial load
duke
parents:
diff changeset
339 }
a61af66fc99e Initial load
duke
parents:
diff changeset
340
a61af66fc99e Initial load
duke
parents:
diff changeset
341 print_bytecode_count();
2250
f7de3327c683 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 2177
diff changeset
342 if (PrintMallocStatistics) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
343 tty->print("allocation stats: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
344 alloc_stats.print();
a61af66fc99e Initial load
duke
parents:
diff changeset
345 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
346 }
a61af66fc99e Initial load
duke
parents:
diff changeset
347
a61af66fc99e Initial load
duke
parents:
diff changeset
348 if (PrintSystemDictionaryAtExit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
349 SystemDictionary::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
350 }
a61af66fc99e Initial load
duke
parents:
diff changeset
351
a61af66fc99e Initial load
duke
parents:
diff changeset
352 if (PrintBiasedLockingStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
353 BiasedLocking::print_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
355
a61af66fc99e Initial load
duke
parents:
diff changeset
356 #ifdef ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
357 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
358 if (ZapDeadCompiledLocals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
359 tty->print_cr("Compile::CompiledZap_count = %d", Compile::CompiledZap_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
360 tty->print_cr("OptoRuntime::ZapDeadCompiledLocals_count = %d", OptoRuntime::ZapDeadCompiledLocals_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
361 }
a61af66fc99e Initial load
duke
parents:
diff changeset
362 #endif // COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
363 #endif // ENABLE_ZAP_DEAD_LOCALS
6770
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
364 // Native memory tracking data
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
365 if (PrintNMTStatistics) {
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
366 if (MemTracker::is_on()) {
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
367 BaselineTTYOutputer outputer(tty);
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
368 MemTracker::print_memory_usage(outputer, K, false);
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
369 } else {
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
370 tty->print_cr(MemTracker::reason());
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
371 }
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
372 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
374
a61af66fc99e Initial load
duke
parents:
diff changeset
375 #else // PRODUCT MODE STATISTICS
a61af66fc99e Initial load
duke
parents:
diff changeset
376
a61af66fc99e Initial load
duke
parents:
diff changeset
377 void print_statistics() {
a61af66fc99e Initial load
duke
parents:
diff changeset
378
a61af66fc99e Initial load
duke
parents:
diff changeset
379 if (CITime) {
a61af66fc99e Initial load
duke
parents:
diff changeset
380 CompileBroker::print_times();
a61af66fc99e Initial load
duke
parents:
diff changeset
381 }
a61af66fc99e Initial load
duke
parents:
diff changeset
382 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
383 if (PrintPreciseBiasedLockingStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
384 OptoRuntime::print_named_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
385 }
a61af66fc99e Initial load
duke
parents:
diff changeset
386 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
387 if (PrintBiasedLockingStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
388 BiasedLocking::print_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
389 }
6770
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
390
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
391 // Native memory tracking data
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
392 if (PrintNMTStatistics) {
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
393 if (MemTracker::is_on()) {
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
394 BaselineTTYOutputer outputer(tty);
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
395 MemTracker::print_memory_usage(outputer, K, false);
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
396 } else {
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
397 tty->print_cr(MemTracker::reason());
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
398 }
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
399 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
400 }
a61af66fc99e Initial load
duke
parents:
diff changeset
401
a61af66fc99e Initial load
duke
parents:
diff changeset
402 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404
a61af66fc99e Initial load
duke
parents:
diff changeset
405 // Helper class for registering on_exit calls through JVM_OnExit
a61af66fc99e Initial load
duke
parents:
diff changeset
406
a61af66fc99e Initial load
duke
parents:
diff changeset
407 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
408 typedef void (*__exit_proc)(void);
a61af66fc99e Initial load
duke
parents:
diff changeset
409 }
a61af66fc99e Initial load
duke
parents:
diff changeset
410
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4800
diff changeset
411 class ExitProc : public CHeapObj<mtInternal> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
412 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
413 __exit_proc _proc;
a61af66fc99e Initial load
duke
parents:
diff changeset
414 // void (*_proc)(void);
a61af66fc99e Initial load
duke
parents:
diff changeset
415 ExitProc* _next;
a61af66fc99e Initial load
duke
parents:
diff changeset
416 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // ExitProc(void (*proc)(void)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
418 ExitProc(__exit_proc proc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
419 _proc = proc;
a61af66fc99e Initial load
duke
parents:
diff changeset
420 _next = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
421 }
a61af66fc99e Initial load
duke
parents:
diff changeset
422 void evaluate() { _proc(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
423 ExitProc* next() const { return _next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
424 void set_next(ExitProc* next) { _next = next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
425 };
a61af66fc99e Initial load
duke
parents:
diff changeset
426
a61af66fc99e Initial load
duke
parents:
diff changeset
427
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // Linked list of registered on_exit procedures
a61af66fc99e Initial load
duke
parents:
diff changeset
429
a61af66fc99e Initial load
duke
parents:
diff changeset
430 static ExitProc* exit_procs = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
431
a61af66fc99e Initial load
duke
parents:
diff changeset
432
a61af66fc99e Initial load
duke
parents:
diff changeset
433 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
434 void register_on_exit_function(void (*func)(void)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
435 ExitProc *entry = new ExitProc(func);
a61af66fc99e Initial load
duke
parents:
diff changeset
436 // Classic vm does not throw an exception in case the allocation failed,
a61af66fc99e Initial load
duke
parents:
diff changeset
437 if (entry != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
438 entry->set_next(exit_procs);
a61af66fc99e Initial load
duke
parents:
diff changeset
439 exit_procs = entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
440 }
a61af66fc99e Initial load
duke
parents:
diff changeset
441 }
a61af66fc99e Initial load
duke
parents:
diff changeset
442 }
a61af66fc99e Initial load
duke
parents:
diff changeset
443
a61af66fc99e Initial load
duke
parents:
diff changeset
444 // Note: before_exit() can be executed only once, if more than one threads
a61af66fc99e Initial load
duke
parents:
diff changeset
445 // are trying to shutdown the VM at the same time, only one thread
a61af66fc99e Initial load
duke
parents:
diff changeset
446 // can run before_exit() and all other threads must wait.
a61af66fc99e Initial load
duke
parents:
diff changeset
447 void before_exit(JavaThread * thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
448 #define BEFORE_EXIT_NOT_RUN 0
a61af66fc99e Initial load
duke
parents:
diff changeset
449 #define BEFORE_EXIT_RUNNING 1
a61af66fc99e Initial load
duke
parents:
diff changeset
450 #define BEFORE_EXIT_DONE 2
a61af66fc99e Initial load
duke
parents:
diff changeset
451 static jint volatile _before_exit_status = BEFORE_EXIT_NOT_RUN;
a61af66fc99e Initial load
duke
parents:
diff changeset
452
a61af66fc99e Initial load
duke
parents:
diff changeset
453 // Note: don't use a Mutex to guard the entire before_exit(), as
a61af66fc99e Initial load
duke
parents:
diff changeset
454 // JVMTI post_thread_end_event and post_vm_death_event will run native code.
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // A CAS or OSMutex would work just fine but then we need to manipulate
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // thread state for Safepoint. Here we use Monitor wait() and notify_all()
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // for synchronization.
a61af66fc99e Initial load
duke
parents:
diff changeset
458 { MutexLocker ml(BeforeExit_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
459 switch (_before_exit_status) {
a61af66fc99e Initial load
duke
parents:
diff changeset
460 case BEFORE_EXIT_NOT_RUN:
a61af66fc99e Initial load
duke
parents:
diff changeset
461 _before_exit_status = BEFORE_EXIT_RUNNING;
a61af66fc99e Initial load
duke
parents:
diff changeset
462 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
463 case BEFORE_EXIT_RUNNING:
a61af66fc99e Initial load
duke
parents:
diff changeset
464 while (_before_exit_status == BEFORE_EXIT_RUNNING) {
a61af66fc99e Initial load
duke
parents:
diff changeset
465 BeforeExit_lock->wait();
a61af66fc99e Initial load
duke
parents:
diff changeset
466 }
a61af66fc99e Initial load
duke
parents:
diff changeset
467 assert(_before_exit_status == BEFORE_EXIT_DONE, "invalid state");
a61af66fc99e Initial load
duke
parents:
diff changeset
468 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
469 case BEFORE_EXIT_DONE:
a61af66fc99e Initial load
duke
parents:
diff changeset
470 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
471 }
a61af66fc99e Initial load
duke
parents:
diff changeset
472 }
a61af66fc99e Initial load
duke
parents:
diff changeset
473
a61af66fc99e Initial load
duke
parents:
diff changeset
474 // The only difference between this and Win32's _onexit procs is that
a61af66fc99e Initial load
duke
parents:
diff changeset
475 // this version is invoked before any threads get killed.
a61af66fc99e Initial load
duke
parents:
diff changeset
476 ExitProc* current = exit_procs;
a61af66fc99e Initial load
duke
parents:
diff changeset
477 while (current != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
478 ExitProc* next = current->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
479 current->evaluate();
a61af66fc99e Initial load
duke
parents:
diff changeset
480 delete current;
a61af66fc99e Initial load
duke
parents:
diff changeset
481 current = next;
a61af66fc99e Initial load
duke
parents:
diff changeset
482 }
a61af66fc99e Initial load
duke
parents:
diff changeset
483
a61af66fc99e Initial load
duke
parents:
diff changeset
484 // Hang forever on exit if we're reporting an error.
a61af66fc99e Initial load
duke
parents:
diff changeset
485 if (ShowMessageBoxOnError && is_error_reported()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
486 os::infinite_sleep();
a61af66fc99e Initial load
duke
parents:
diff changeset
487 }
a61af66fc99e Initial load
duke
parents:
diff changeset
488
a61af66fc99e Initial load
duke
parents:
diff changeset
489 // Terminate watcher thread - must before disenrolling any periodic task
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1644
diff changeset
490 if (PeriodicTask::num_tasks() > 0)
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1644
diff changeset
491 WatcherThread::stop();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
492
a61af66fc99e Initial load
duke
parents:
diff changeset
493 // Print statistics gathered (profiling ...)
a61af66fc99e Initial load
duke
parents:
diff changeset
494 if (Arguments::has_profile()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
495 FlatProfiler::disengage();
a61af66fc99e Initial load
duke
parents:
diff changeset
496 FlatProfiler::print(10);
a61af66fc99e Initial load
duke
parents:
diff changeset
497 }
a61af66fc99e Initial load
duke
parents:
diff changeset
498
a61af66fc99e Initial load
duke
parents:
diff changeset
499 // shut down the StatSampler task
a61af66fc99e Initial load
duke
parents:
diff changeset
500 StatSampler::disengage();
a61af66fc99e Initial load
duke
parents:
diff changeset
501 StatSampler::destroy();
a61af66fc99e Initial load
duke
parents:
diff changeset
502
3769
ef2d1b8f2dd4 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 2304
diff changeset
503 // We do not need to explicitly stop concurrent GC threads because the
ef2d1b8f2dd4 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 2304
diff changeset
504 // JVM will be taken down at a safepoint when such threads are inactive --
ef2d1b8f2dd4 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 2304
diff changeset
505 // except for some concurrent G1 threads, see (comment in)
ef2d1b8f2dd4 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 2304
diff changeset
506 // Threads::destroy_vm().
0
a61af66fc99e Initial load
duke
parents:
diff changeset
507
a61af66fc99e Initial load
duke
parents:
diff changeset
508 // Print GC/heap related information.
a61af66fc99e Initial load
duke
parents:
diff changeset
509 if (PrintGCDetails) {
a61af66fc99e Initial load
duke
parents:
diff changeset
510 Universe::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
511 AdaptiveSizePolicyOutput(0);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
512 if (Verbose) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
513 ClassLoaderDataGraph::dump_on(gclog_or_tty);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
514 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
515 }
a61af66fc99e Initial load
duke
parents:
diff changeset
516
a61af66fc99e Initial load
duke
parents:
diff changeset
517
a61af66fc99e Initial load
duke
parents:
diff changeset
518 if (Arguments::has_alloc_profile()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
519 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
520 // Do one last collection to enumerate all the objects
a61af66fc99e Initial load
duke
parents:
diff changeset
521 // allocated since the last one.
a61af66fc99e Initial load
duke
parents:
diff changeset
522 Universe::heap()->collect(GCCause::_allocation_profiler);
a61af66fc99e Initial load
duke
parents:
diff changeset
523 AllocationProfiler::disengage();
a61af66fc99e Initial load
duke
parents:
diff changeset
524 AllocationProfiler::print(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
525 }
a61af66fc99e Initial load
duke
parents:
diff changeset
526
a61af66fc99e Initial load
duke
parents:
diff changeset
527 if (PrintBytecodeHistogram) {
a61af66fc99e Initial load
duke
parents:
diff changeset
528 BytecodeHistogram::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
529 }
a61af66fc99e Initial load
duke
parents:
diff changeset
530
a61af66fc99e Initial load
duke
parents:
diff changeset
531 if (JvmtiExport::should_post_thread_life()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
532 JvmtiExport::post_thread_end(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
533 }
4800
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4006
diff changeset
534
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4006
diff changeset
535 EVENT_BEGIN(TraceEventThreadEnd, event);
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4006
diff changeset
536 EVENT_COMMIT(event,
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4006
diff changeset
537 EVENT_SET(event, javalangthread, java_lang_Thread::thread_id(thread->threadObj())));
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4006
diff changeset
538
0
a61af66fc99e Initial load
duke
parents:
diff changeset
539 // Always call even when there are not JVMTI environments yet, since environments
a61af66fc99e Initial load
duke
parents:
diff changeset
540 // may be attached late and JVMTI must track phases of VM execution
a61af66fc99e Initial load
duke
parents:
diff changeset
541 JvmtiExport::post_vm_death();
a61af66fc99e Initial load
duke
parents:
diff changeset
542 Threads::shutdown_vm_agents();
a61af66fc99e Initial load
duke
parents:
diff changeset
543
a61af66fc99e Initial load
duke
parents:
diff changeset
544 // Terminate the signal thread
a61af66fc99e Initial load
duke
parents:
diff changeset
545 // Note: we don't wait until it actually dies.
a61af66fc99e Initial load
duke
parents:
diff changeset
546 os::terminate_signal_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
547
a61af66fc99e Initial load
duke
parents:
diff changeset
548 print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
549 Universe::heap()->print_tracing_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
550
a61af66fc99e Initial load
duke
parents:
diff changeset
551 { MutexLocker ml(BeforeExit_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
552 _before_exit_status = BEFORE_EXIT_DONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
553 BeforeExit_lock->notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
554 }
a61af66fc99e Initial load
duke
parents:
diff changeset
555
a61af66fc99e Initial load
duke
parents:
diff changeset
556 #undef BEFORE_EXIT_NOT_RUN
a61af66fc99e Initial load
duke
parents:
diff changeset
557 #undef BEFORE_EXIT_RUNNING
a61af66fc99e Initial load
duke
parents:
diff changeset
558 #undef BEFORE_EXIT_DONE
a61af66fc99e Initial load
duke
parents:
diff changeset
559 }
a61af66fc99e Initial load
duke
parents:
diff changeset
560
a61af66fc99e Initial load
duke
parents:
diff changeset
561 void vm_exit(int code) {
2096
0eb90baf1b69 6583275: Hotspot crash in vm_perform_shutdown_actions due to uninitialized TLS during out of memory handling
coleenp
parents: 1972
diff changeset
562 Thread* thread = ThreadLocalStorage::is_initialized() ?
0eb90baf1b69 6583275: Hotspot crash in vm_perform_shutdown_actions due to uninitialized TLS during out of memory handling
coleenp
parents: 1972
diff changeset
563 ThreadLocalStorage::get_thread_slow() : NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
564 if (thread == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
565 // we have serious problems -- just exit
a61af66fc99e Initial load
duke
parents:
diff changeset
566 vm_direct_exit(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
567 }
a61af66fc99e Initial load
duke
parents:
diff changeset
568
a61af66fc99e Initial load
duke
parents:
diff changeset
569 if (VMThread::vm_thread() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
570 // Fire off a VM_Exit operation to bring VM to a safepoint and exit
a61af66fc99e Initial load
duke
parents:
diff changeset
571 VM_Exit op(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
572 if (thread->is_Java_thread())
a61af66fc99e Initial load
duke
parents:
diff changeset
573 ((JavaThread*)thread)->set_thread_state(_thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
574 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
575 // should never reach here; but in case something wrong with VM Thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
576 vm_direct_exit(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
577 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
578 // VM thread is gone, just exit
a61af66fc99e Initial load
duke
parents:
diff changeset
579 vm_direct_exit(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
580 }
a61af66fc99e Initial load
duke
parents:
diff changeset
581 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
582 }
a61af66fc99e Initial load
duke
parents:
diff changeset
583
a61af66fc99e Initial load
duke
parents:
diff changeset
584 void notify_vm_shutdown() {
a61af66fc99e Initial load
duke
parents:
diff changeset
585 // For now, just a dtrace probe.
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
586 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
587 HS_DTRACE_PROBE(hotspot, vm__shutdown);
1547
fb1a39993f69 6951319: enable solaris builds using Sun Studio 12 update 1
jcoomes
parents: 242
diff changeset
588 HS_DTRACE_WORKAROUND_TAIL_CALL_BUG();
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
589 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
590 HOTSPOT_VM_SHUTDOWN();
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
591 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
592 }
a61af66fc99e Initial load
duke
parents:
diff changeset
593
a61af66fc99e Initial load
duke
parents:
diff changeset
594 void vm_direct_exit(int code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
595 notify_vm_shutdown();
2302
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2192
diff changeset
596 os::wait_for_keypress_at_exit();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
597 ::exit(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
598 }
a61af66fc99e Initial load
duke
parents:
diff changeset
599
a61af66fc99e Initial load
duke
parents:
diff changeset
600 void vm_perform_shutdown_actions() {
a61af66fc99e Initial load
duke
parents:
diff changeset
601 // Warning: do not call 'exit_globals()' here. All threads are still running.
a61af66fc99e Initial load
duke
parents:
diff changeset
602 // Calling 'exit_globals()' will disable thread-local-storage and cause all
a61af66fc99e Initial load
duke
parents:
diff changeset
603 // kinds of assertions to trigger in debug mode.
a61af66fc99e Initial load
duke
parents:
diff changeset
604 if (is_init_completed()) {
2096
0eb90baf1b69 6583275: Hotspot crash in vm_perform_shutdown_actions due to uninitialized TLS during out of memory handling
coleenp
parents: 1972
diff changeset
605 Thread* thread = ThreadLocalStorage::is_initialized() ?
0eb90baf1b69 6583275: Hotspot crash in vm_perform_shutdown_actions due to uninitialized TLS during out of memory handling
coleenp
parents: 1972
diff changeset
606 ThreadLocalStorage::get_thread_slow() : NULL;
0eb90baf1b69 6583275: Hotspot crash in vm_perform_shutdown_actions due to uninitialized TLS during out of memory handling
coleenp
parents: 1972
diff changeset
607 if (thread != NULL && thread->is_Java_thread()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
608 // We are leaving the VM, set state to native (in case any OS exit
a61af66fc99e Initial load
duke
parents:
diff changeset
609 // handlers call back to the VM)
a61af66fc99e Initial load
duke
parents:
diff changeset
610 JavaThread* jt = (JavaThread*)thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
611 // Must always be walkable or have no last_Java_frame when in
a61af66fc99e Initial load
duke
parents:
diff changeset
612 // thread_in_native
a61af66fc99e Initial load
duke
parents:
diff changeset
613 jt->frame_anchor()->make_walkable(jt);
a61af66fc99e Initial load
duke
parents:
diff changeset
614 jt->set_thread_state(_thread_in_native);
a61af66fc99e Initial load
duke
parents:
diff changeset
615 }
a61af66fc99e Initial load
duke
parents:
diff changeset
616 }
a61af66fc99e Initial load
duke
parents:
diff changeset
617 notify_vm_shutdown();
a61af66fc99e Initial load
duke
parents:
diff changeset
618 }
a61af66fc99e Initial load
duke
parents:
diff changeset
619
a61af66fc99e Initial load
duke
parents:
diff changeset
620 void vm_shutdown()
a61af66fc99e Initial load
duke
parents:
diff changeset
621 {
a61af66fc99e Initial load
duke
parents:
diff changeset
622 vm_perform_shutdown_actions();
2302
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2192
diff changeset
623 os::wait_for_keypress_at_exit();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
624 os::shutdown();
a61af66fc99e Initial load
duke
parents:
diff changeset
625 }
a61af66fc99e Initial load
duke
parents:
diff changeset
626
227
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
627 void vm_abort(bool dump_core) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
628 vm_perform_shutdown_actions();
2302
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2192
diff changeset
629 os::wait_for_keypress_at_exit();
227
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
630 os::abort(dump_core);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
631 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
632 }
a61af66fc99e Initial load
duke
parents:
diff changeset
633
a61af66fc99e Initial load
duke
parents:
diff changeset
634 void vm_notify_during_shutdown(const char* error, const char* message) {
a61af66fc99e Initial load
duke
parents:
diff changeset
635 if (error != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
636 tty->print_cr("Error occurred during initialization of VM");
a61af66fc99e Initial load
duke
parents:
diff changeset
637 tty->print("%s", error);
a61af66fc99e Initial load
duke
parents:
diff changeset
638 if (message != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
639 tty->print_cr(": %s", message);
a61af66fc99e Initial load
duke
parents:
diff changeset
640 }
a61af66fc99e Initial load
duke
parents:
diff changeset
641 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
642 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
643 }
a61af66fc99e Initial load
duke
parents:
diff changeset
644 }
a61af66fc99e Initial load
duke
parents:
diff changeset
645 if (ShowMessageBoxOnError && WizardMode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
646 fatal("Error occurred during initialization of VM");
a61af66fc99e Initial load
duke
parents:
diff changeset
647 }
a61af66fc99e Initial load
duke
parents:
diff changeset
648 }
a61af66fc99e Initial load
duke
parents:
diff changeset
649
a61af66fc99e Initial load
duke
parents:
diff changeset
650 void vm_exit_during_initialization(Handle exception) {
a61af66fc99e Initial load
duke
parents:
diff changeset
651 tty->print_cr("Error occurred during initialization of VM");
a61af66fc99e Initial load
duke
parents:
diff changeset
652 // If there are exceptions on this thread it must be cleared
a61af66fc99e Initial load
duke
parents:
diff changeset
653 // first and here. Any future calls to EXCEPTION_MARK requires
a61af66fc99e Initial load
duke
parents:
diff changeset
654 // that no pending exceptions exist.
a61af66fc99e Initial load
duke
parents:
diff changeset
655 Thread *THREAD = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
656 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
657 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
658 }
a61af66fc99e Initial load
duke
parents:
diff changeset
659 java_lang_Throwable::print(exception, tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
660 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
661 java_lang_Throwable::print_stack_trace(exception(), tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
662 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
663 vm_notify_during_shutdown(NULL, NULL);
227
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
664
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
665 // Failure during initialization, we don't want to dump core
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
666 vm_abort(false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
667 }
a61af66fc99e Initial load
duke
parents:
diff changeset
668
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2129
diff changeset
669 void vm_exit_during_initialization(Symbol* ex, const char* message) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
670 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
671 vm_notify_during_shutdown(ex->as_C_string(), message);
227
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
672
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
673 // Failure during initialization, we don't want to dump core
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
674 vm_abort(false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
675 }
a61af66fc99e Initial load
duke
parents:
diff changeset
676
a61af66fc99e Initial load
duke
parents:
diff changeset
677 void vm_exit_during_initialization(const char* error, const char* message) {
a61af66fc99e Initial load
duke
parents:
diff changeset
678 vm_notify_during_shutdown(error, message);
227
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
679
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
680 // Failure during initialization, we don't want to dump core
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
681 vm_abort(false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
682 }
a61af66fc99e Initial load
duke
parents:
diff changeset
683
a61af66fc99e Initial load
duke
parents:
diff changeset
684 void vm_shutdown_during_initialization(const char* error, const char* message) {
a61af66fc99e Initial load
duke
parents:
diff changeset
685 vm_notify_during_shutdown(error, message);
a61af66fc99e Initial load
duke
parents:
diff changeset
686 vm_shutdown();
a61af66fc99e Initial load
duke
parents:
diff changeset
687 }
a61af66fc99e Initial load
duke
parents:
diff changeset
688
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
689 JDK_Version JDK_Version::_current;
6181
f8de958e5b2c 7176856: add the JRE name to the error log
twisti
parents: 4800
diff changeset
690 const char* JDK_Version::_runtime_name;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
691
a61af66fc99e Initial load
duke
parents:
diff changeset
692 void JDK_Version::initialize() {
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
693 jdk_version_info info;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
694 assert(!_current.is_valid(), "Don't initialize twice");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
695
0
a61af66fc99e Initial load
duke
parents:
diff changeset
696 void *lib_handle = os::native_java_library();
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
697 jdk_version_info_fn_t func = CAST_TO_FN_PTR(jdk_version_info_fn_t,
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
698 os::dll_lookup(lib_handle, "JDK_GetVersionInfo0"));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
699
a61af66fc99e Initial load
duke
parents:
diff changeset
700 if (func == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
701 // JDK older than 1.6
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
702 _current._partially_initialized = true;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
703 } else {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
704 (*func)(&info, sizeof(info));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
705
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
706 int major = JDK_VERSION_MAJOR(info.jdk_version);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
707 int minor = JDK_VERSION_MINOR(info.jdk_version);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
708 int micro = JDK_VERSION_MICRO(info.jdk_version);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
709 int build = JDK_VERSION_BUILD(info.jdk_version);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
710 if (major == 1 && minor > 4) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
711 // We represent "1.5.0" as "5.0", but 1.4.2 as itself.
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
712 major = minor;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
713 minor = micro;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
714 micro = 0;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
715 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
716 _current = JDK_Version(major, minor, micro, info.update_version,
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
717 info.special_update_version, build,
2129
8f8dfba37802 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 2096
diff changeset
718 info.thread_park_blocker == 1,
3917
eca1193ca245 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 3841
diff changeset
719 info.post_vm_init_hook_enabled == 1,
eca1193ca245 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 3841
diff changeset
720 info.pending_list_uses_discovered_field == 1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
721 }
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
722 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
723
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
724 void JDK_Version::fully_initialize(
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
725 uint8_t major, uint8_t minor, uint8_t micro, uint8_t update) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
726 // This is only called when current is less than 1.6 and we've gotten
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
727 // far enough in the initialization to determine the exact version.
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
728 assert(major < 6, "not needed for JDK version >= 6");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
729 assert(is_partially_initialized(), "must not initialize");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
730 if (major < 5) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
731 // JDK verison sequence: 1.2.x, 1.3.x, 1.4.x, 5.0.x, 6.0.x, etc.
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
732 micro = minor;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
733 minor = major;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
734 major = 1;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
735 }
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
736 _current = JDK_Version(major, minor, micro, update);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
737 }
a61af66fc99e Initial load
duke
parents:
diff changeset
738
a61af66fc99e Initial load
duke
parents:
diff changeset
739 void JDK_Version_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
740 JDK_Version::initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
741 }
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
742
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
743 static int64_t encode_jdk_version(const JDK_Version& v) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
744 return
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
745 ((int64_t)v.major_version() << (BitsPerByte * 5)) |
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
746 ((int64_t)v.minor_version() << (BitsPerByte * 4)) |
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
747 ((int64_t)v.micro_version() << (BitsPerByte * 3)) |
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
748 ((int64_t)v.update_version() << (BitsPerByte * 2)) |
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
749 ((int64_t)v.special_update_version() << (BitsPerByte * 1)) |
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
750 ((int64_t)v.build_number() << (BitsPerByte * 0));
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
751 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
752
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
753 int JDK_Version::compare(const JDK_Version& other) const {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
754 assert(is_valid() && other.is_valid(), "Invalid version (uninitialized?)");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
755 if (!is_partially_initialized() && other.is_partially_initialized()) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
756 return -(other.compare(*this)); // flip the comparators
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
757 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
758 assert(!other.is_partially_initialized(), "Not initialized yet");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
759 if (is_partially_initialized()) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
760 assert(other.major_version() >= 6,
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
761 "Invalid JDK version comparison during initialization");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
762 return -1;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
763 } else {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
764 uint64_t e = encode_jdk_version(*this);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
765 uint64_t o = encode_jdk_version(other);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
766 return (e > o) ? 1 : ((e == o) ? 0 : -1);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
767 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
768 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
769
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
770 void JDK_Version::to_string(char* buffer, size_t buflen) const {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
771 size_t index = 0;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
772 if (!is_valid()) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
773 jio_snprintf(buffer, buflen, "%s", "(uninitialized)");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
774 } else if (is_partially_initialized()) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
775 jio_snprintf(buffer, buflen, "%s", "(uninitialized) pre-1.6.0");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
776 } else {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
777 index += jio_snprintf(
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
778 &buffer[index], buflen - index, "%d.%d", _major, _minor);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
779 if (_micro > 0) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
780 index += jio_snprintf(&buffer[index], buflen - index, ".%d", _micro);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
781 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
782 if (_update > 0) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
783 index += jio_snprintf(&buffer[index], buflen - index, "_%02d", _update);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
784 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
785 if (_special > 0) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
786 index += jio_snprintf(&buffer[index], buflen - index, "%c", _special);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
787 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
788 if (_build > 0) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
789 index += jio_snprintf(&buffer[index], buflen - index, "-b%02d", _build);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
790 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
791 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
792 }