annotate src/share/vm/runtime/java.cpp @ 13212:eb03a7335eb0

Use fixed instead of virtual register for target in far foreign call, since the register allocator does not support virtual registers to be used at call sites.
author Christian Wimmer <christian.wimmer@oracle.com>
date Mon, 02 Dec 2013 14:20:32 -0800
parents b00553202ec2
children d8041d695d19
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 8001
diff changeset
2 * Copyright (c) 1997, 2013, 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"
4559
723df37192d6 Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 4319
diff changeset
33 #ifdef GRAAL
2925
b78b4ae0757c Also call Compiler shutdown hook in case of System.exit call. Draft VMExits.Sandbox class.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2304
diff changeset
34 #include "graal/graalCompiler.hpp"
4559
723df37192d6 Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 4319
diff changeset
35 #endif
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
36 #include "memory/genCollectedHeap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
37 #include "memory/oopFactory.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
38 #include "memory/universe.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
39 #include "oops/constantPool.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
40 #include "oops/generateOopMap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
41 #include "oops/instanceKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
42 #include "oops/instanceOop.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
43 #include "oops/method.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
44 #include "oops/objArrayOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
45 #include "oops/oop.inline.hpp"
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2129
diff changeset
46 #include "oops/symbol.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
47 #include "prims/jvmtiExport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
48 #include "runtime/arguments.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
49 #include "runtime/biasedLocking.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
50 #include "runtime/compilationPolicy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
51 #include "runtime/fprofiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
52 #include "runtime/init.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
53 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
54 #include "runtime/java.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
55 #include "runtime/memprofiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
56 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
57 #include "runtime/statSampler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
58 #include "runtime/task.hpp"
7180
f34d701e952e 8003935: Simplify the needed includes for using Thread::current()
stefank
parents: 6921
diff changeset
59 #include "runtime/thread.inline.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
60 #include "runtime/timer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
61 #include "runtime/vm_operations.hpp"
6770
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
62 #include "services/memReporter.hpp"
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
63 #include "services/memTracker.hpp"
4800
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4006
diff changeset
64 #include "trace/tracing.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
65 #include "utilities/dtrace.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
66 #include "utilities/globalDefinitions.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
67 #include "utilities/histogram.hpp"
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7596
diff changeset
68 #include "utilities/macros.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
69 #include "utilities/vmError.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
70 #ifdef TARGET_ARCH_x86
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
71 # include "vm_version_x86.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_sparc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
74 # include "vm_version_sparc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
75 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
76 #ifdef TARGET_ARCH_zero
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
77 # include "vm_version_zero.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
78 #endif
2192
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
79 #ifdef TARGET_ARCH_arm
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
80 # include "vm_version_arm.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
81 #endif
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
82 #ifdef TARGET_ARCH_ppc
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
83 # include "vm_version_ppc.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
84 #endif
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7596
diff changeset
85 #if INCLUDE_ALL_GCS
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
86 #include "gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
87 #include "gc_implementation/parallelScavenge/psScavenge.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
88 #include "gc_implementation/parallelScavenge/psScavenge.inline.hpp"
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7596
diff changeset
89 #endif // INCLUDE_ALL_GCS
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
90 #ifdef COMPILER1
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
91 #include "c1/c1_Compiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
92 #include "c1/c1_Runtime1.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
93 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
94 #ifdef COMPILER2
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
95 #include "code/compiledIC.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
96 #include "compiler/methodLiveness.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
97 #include "opto/compile.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
98 #include "opto/indexSet.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
99 #include "opto/runtime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
100 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
101
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
102 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
103 HS_DTRACE_PROBE_DECL(hotspot, vm__shutdown);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
104 #endif /* !USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // Statistics printing (method invocation histogram)
a61af66fc99e Initial load
duke
parents:
diff changeset
109
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
110 GrowableArray<Method*>* collected_invoked_methods;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
111
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
112 void collect_invoked_methods(Method* m) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
113 if (m->invocation_count() + m->compiled_invocation_count() >= 1 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
114 collected_invoked_methods->push(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
115 }
a61af66fc99e Initial load
duke
parents:
diff changeset
116 }
a61af66fc99e Initial load
duke
parents:
diff changeset
117
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_profiled_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_profiled_methods(Method* m) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
122 Thread* thread = Thread::current();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
123 // 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
124 // to the metadata_handles() array on the thread.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
125 HandleMark hm(thread);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
126 methodHandle mh(thread, m);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
127 if ((m->method_data() != NULL) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
128 (PrintMethodData || CompilerOracle::should_print(mh))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
129 collected_profiled_methods->push(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
130 }
a61af66fc99e Initial load
duke
parents:
diff changeset
131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
134 int compare_methods(Method** a, Method** b) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
135 // %%% there can be 32-bit overflow here
a61af66fc99e Initial load
duke
parents:
diff changeset
136 return ((*b)->invocation_count() + (*b)->compiled_invocation_count())
a61af66fc99e Initial load
duke
parents:
diff changeset
137 - ((*a)->invocation_count() + (*a)->compiled_invocation_count());
a61af66fc99e Initial load
duke
parents:
diff changeset
138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141 void print_method_invocation_histogram() {
a61af66fc99e Initial load
duke
parents:
diff changeset
142 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
143 HandleMark hm;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
144 collected_invoked_methods = new GrowableArray<Method*>(1024);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
145 SystemDictionary::methods_do(collect_invoked_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
146 collected_invoked_methods->sort(&compare_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
147 //
a61af66fc99e Initial load
duke
parents:
diff changeset
148 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
149 tty->print_cr("Histogram Over MethodOop Invocation Counters (cutoff = %d):", MethodHistogramCutoff);
a61af66fc99e Initial load
duke
parents:
diff changeset
150 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
151 tty->print_cr("____Count_(I+C)____Method________________________Module_________________");
a61af66fc99e Initial load
duke
parents:
diff changeset
152 unsigned total = 0, int_total = 0, comp_total = 0, static_total = 0, final_total = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
153 synch_total = 0, nativ_total = 0, acces_total = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
154 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
155 Method* m = collected_invoked_methods->at(index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
156 int c = m->invocation_count() + m->compiled_invocation_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
157 if (c >= MethodHistogramCutoff) m->print_invocation_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
158 int_total += m->invocation_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
159 comp_total += m->compiled_invocation_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
160 if (m->is_final()) final_total += c;
a61af66fc99e Initial load
duke
parents:
diff changeset
161 if (m->is_static()) static_total += c;
a61af66fc99e Initial load
duke
parents:
diff changeset
162 if (m->is_synchronized()) synch_total += c;
a61af66fc99e Initial load
duke
parents:
diff changeset
163 if (m->is_native()) nativ_total += c;
a61af66fc99e Initial load
duke
parents:
diff changeset
164 if (m->is_accessor()) acces_total += c;
a61af66fc99e Initial load
duke
parents:
diff changeset
165 }
a61af66fc99e Initial load
duke
parents:
diff changeset
166 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
167 total = int_total + comp_total;
a61af66fc99e Initial load
duke
parents:
diff changeset
168 tty->print_cr("Invocations summary:");
a61af66fc99e Initial load
duke
parents:
diff changeset
169 tty->print_cr("\t%9d (%4.1f%%) interpreted", int_total, 100.0 * int_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
170 tty->print_cr("\t%9d (%4.1f%%) compiled", comp_total, 100.0 * comp_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
171 tty->print_cr("\t%9d (100%%) total", total);
a61af66fc99e Initial load
duke
parents:
diff changeset
172 tty->print_cr("\t%9d (%4.1f%%) synchronized", synch_total, 100.0 * synch_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
173 tty->print_cr("\t%9d (%4.1f%%) final", final_total, 100.0 * final_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
174 tty->print_cr("\t%9d (%4.1f%%) static", static_total, 100.0 * static_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
175 tty->print_cr("\t%9d (%4.1f%%) native", nativ_total, 100.0 * nativ_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
176 tty->print_cr("\t%9d (%4.1f%%) accessor", acces_total, 100.0 * acces_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
177 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
178 SharedRuntime::print_call_statistics(comp_total);
a61af66fc99e Initial load
duke
parents:
diff changeset
179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 void print_method_profiling_data() {
a61af66fc99e Initial load
duke
parents:
diff changeset
182 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
183 HandleMark hm;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
184 collected_profiled_methods = new GrowableArray<Method*>(1024);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
185 SystemDictionary::methods_do(collect_profiled_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
186 collected_profiled_methods->sort(&compare_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 int count = collected_profiled_methods->length();
12875
d13d7aba8c12 8023657: New type profiling points: arguments to call
roland
parents: 12275
diff changeset
189 int total_size = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
190 if (count > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
191 for (int index = 0; index < count; index++) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
192 Method* m = collected_profiled_methods->at(index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
193 ttyLocker ttyl;
a61af66fc99e Initial load
duke
parents:
diff changeset
194 tty->print_cr("------------------------------------------------------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
195 //m->print_name(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
196 m->print_invocation_count();
12875
d13d7aba8c12 8023657: New type profiling points: arguments to call
roland
parents: 12275
diff changeset
197 tty->print_cr(" mdo size: %d bytes", m->method_data()->size_in_bytes());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
198 tty->cr();
12962
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents: 12875
diff changeset
199 // Dump data on parameters if any
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents: 12875
diff changeset
200 if (m->method_data() != NULL && m->method_data()->parameters_type_data() != NULL) {
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents: 12875
diff changeset
201 tty->fill_to(2);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents: 12875
diff changeset
202 m->method_data()->parameters_type_data()->print_data_on(tty);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents: 12875
diff changeset
203 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
204 m->print_codes();
12875
d13d7aba8c12 8023657: New type profiling points: arguments to call
roland
parents: 12275
diff changeset
205 total_size += m->method_data()->size_in_bytes();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
207 tty->print_cr("------------------------------------------------------------------------");
12875
d13d7aba8c12 8023657: New type profiling points: arguments to call
roland
parents: 12275
diff changeset
208 tty->print_cr("Total MDO size: %d bytes", total_size);
0
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 }
a61af66fc99e Initial load
duke
parents:
diff changeset
260 #endif /* COMPILER1 */
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
263 if ((PrintOptoStatistics || LogVMOutput || LogCompilation) && UseCompiler) {
a61af66fc99e Initial load
duke
parents:
diff changeset
264 FlagSetting fs(DisplayVMOutput, DisplayVMOutput && PrintOptoStatistics);
a61af66fc99e Initial load
duke
parents:
diff changeset
265 Compile::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
266 #ifndef COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
267 Deoptimization::print_statistics();
3841
0f34fdee809e 7071427: AdapterFingerPrint can hold 8 entries per int
never
parents: 3769
diff changeset
268 SharedRuntime::print_statistics();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
269 #endif //COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
270 os::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273 if (PrintLockStatistics || PrintPreciseBiasedLockingStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
274 OptoRuntime::print_named_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
275 }
a61af66fc99e Initial load
duke
parents:
diff changeset
276
a61af66fc99e Initial load
duke
parents:
diff changeset
277 if (TimeLivenessAnalysis) {
a61af66fc99e Initial load
duke
parents:
diff changeset
278 MethodLiveness::print_times();
a61af66fc99e Initial load
duke
parents:
diff changeset
279 }
a61af66fc99e Initial load
duke
parents:
diff changeset
280 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
281 if (CollectIndexSetStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
282 IndexSet::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
284 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
285 #endif // COMPILER2
9700
197426668a5d Enabled nmethod statistics for the HotSpot product build.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8156
diff changeset
286
197426668a5d Enabled nmethod statistics for the HotSpot product build.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8156
diff changeset
287 if (PrintNMethodStatistics) {
197426668a5d Enabled nmethod statistics for the HotSpot product build.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8156
diff changeset
288 nmethod::print_statistics();
197426668a5d Enabled nmethod statistics for the HotSpot product build.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8156
diff changeset
289 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
290 if (CountCompiledCalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
291 print_method_invocation_histogram();
a61af66fc99e Initial load
duke
parents:
diff changeset
292 }
1918
34bd82eba3bb 6997456: Not possible to build just compiler2
iveresov
parents: 1783
diff changeset
293 if (ProfileInterpreter COMPILER1_PRESENT(|| C1UpdateMethodData)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
294 print_method_profiling_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
295 }
a61af66fc99e Initial load
duke
parents:
diff changeset
296 if (TimeCompiler) {
a61af66fc99e Initial load
duke
parents:
diff changeset
297 COMPILER2_PRESENT(Compile::print_timers();)
a61af66fc99e Initial load
duke
parents:
diff changeset
298 }
a61af66fc99e Initial load
duke
parents:
diff changeset
299 if (TimeCompilationPolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
300 CompilationPolicy::policy()->print_time();
a61af66fc99e Initial load
duke
parents:
diff changeset
301 }
a61af66fc99e Initial load
duke
parents:
diff changeset
302 if (TimeOopMap) {
a61af66fc99e Initial load
duke
parents:
diff changeset
303 GenerateOopMap::print_time();
a61af66fc99e Initial load
duke
parents:
diff changeset
304 }
a61af66fc99e Initial load
duke
parents:
diff changeset
305 if (ProfilerCheckIntervals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
306 PeriodicTask::print_intervals();
a61af66fc99e Initial load
duke
parents:
diff changeset
307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
308 if (PrintSymbolTableSizeHistogram) {
a61af66fc99e Initial load
duke
parents:
diff changeset
309 SymbolTable::print_histogram();
a61af66fc99e Initial load
duke
parents:
diff changeset
310 }
a61af66fc99e Initial load
duke
parents:
diff changeset
311 if (CountBytecodes || TraceBytecodes || StopInterpreterAt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
312 BytecodeCounter::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
313 }
a61af66fc99e Initial load
duke
parents:
diff changeset
314 if (PrintBytecodePairHistogram) {
a61af66fc99e Initial load
duke
parents:
diff changeset
315 BytecodePairHistogram::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
316 }
a61af66fc99e Initial load
duke
parents:
diff changeset
317
a61af66fc99e Initial load
duke
parents:
diff changeset
318 if (PrintCodeCache) {
a61af66fc99e Initial load
duke
parents:
diff changeset
319 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
320 CodeCache::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
321 }
a61af66fc99e Initial load
duke
parents:
diff changeset
322
a61af66fc99e Initial load
duke
parents:
diff changeset
323 if (PrintCodeCache2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
324 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
325 CodeCache::print_internals();
a61af66fc99e Initial load
duke
parents:
diff changeset
326 }
a61af66fc99e Initial load
duke
parents:
diff changeset
327
a61af66fc99e Initial load
duke
parents:
diff changeset
328 if (PrintClassStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
329 SystemDictionary::print_class_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
330 }
a61af66fc99e Initial load
duke
parents:
diff changeset
331 if (PrintMethodStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
332 SystemDictionary::print_method_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
333 }
a61af66fc99e Initial load
duke
parents:
diff changeset
334
a61af66fc99e Initial load
duke
parents:
diff changeset
335 if (PrintVtableStats) {
a61af66fc99e Initial load
duke
parents:
diff changeset
336 klassVtable::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
337 klassItable::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
338 }
a61af66fc99e Initial load
duke
parents:
diff changeset
339 if (VerifyOops) {
a61af66fc99e Initial load
duke
parents:
diff changeset
340 tty->print_cr("+VerifyOops count: %d", StubRoutines::verify_oop_count());
a61af66fc99e Initial load
duke
parents:
diff changeset
341 }
a61af66fc99e Initial load
duke
parents:
diff changeset
342
a61af66fc99e Initial load
duke
parents:
diff changeset
343 print_bytecode_count();
2250
f7de3327c683 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 2177
diff changeset
344 if (PrintMallocStatistics) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
345 tty->print("allocation stats: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
346 alloc_stats.print();
a61af66fc99e Initial load
duke
parents:
diff changeset
347 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
348 }
a61af66fc99e Initial load
duke
parents:
diff changeset
349
a61af66fc99e Initial load
duke
parents:
diff changeset
350 if (PrintSystemDictionaryAtExit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
351 SystemDictionary::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
352 }
a61af66fc99e Initial load
duke
parents:
diff changeset
353
a61af66fc99e Initial load
duke
parents:
diff changeset
354 if (PrintBiasedLockingStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
355 BiasedLocking::print_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
356 }
a61af66fc99e Initial load
duke
parents:
diff changeset
357
a61af66fc99e Initial load
duke
parents:
diff changeset
358 #ifdef ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
359 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
360 if (ZapDeadCompiledLocals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
361 tty->print_cr("Compile::CompiledZap_count = %d", Compile::CompiledZap_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
362 tty->print_cr("OptoRuntime::ZapDeadCompiledLocals_count = %d", OptoRuntime::ZapDeadCompiledLocals_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
363 }
a61af66fc99e Initial load
duke
parents:
diff changeset
364 #endif // COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
365 #endif // ENABLE_ZAP_DEAD_LOCALS
6770
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
366 // Native memory tracking data
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
367 if (PrintNMTStatistics) {
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
368 if (MemTracker::is_on()) {
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
369 BaselineTTYOutputer outputer(tty);
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
370 MemTracker::print_memory_usage(outputer, K, false);
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
371 } else {
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
372 tty->print_cr(MemTracker::reason());
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
373 }
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
374 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
375 }
a61af66fc99e Initial load
duke
parents:
diff changeset
376
a61af66fc99e Initial load
duke
parents:
diff changeset
377 #else // PRODUCT MODE STATISTICS
a61af66fc99e Initial load
duke
parents:
diff changeset
378
a61af66fc99e Initial load
duke
parents:
diff changeset
379 void print_statistics() {
a61af66fc99e Initial load
duke
parents:
diff changeset
380
a61af66fc99e Initial load
duke
parents:
diff changeset
381 if (CITime) {
a61af66fc99e Initial load
duke
parents:
diff changeset
382 CompileBroker::print_times();
a61af66fc99e Initial load
duke
parents:
diff changeset
383 }
7595
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7180
diff changeset
384
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7180
diff changeset
385 if (PrintCodeCache) {
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7180
diff changeset
386 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7180
diff changeset
387 CodeCache::print();
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7180
diff changeset
388 }
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7180
diff changeset
389
0
a61af66fc99e Initial load
duke
parents:
diff changeset
390 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
391 if (PrintPreciseBiasedLockingStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
392 OptoRuntime::print_named_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
393 }
a61af66fc99e Initial load
duke
parents:
diff changeset
394 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
395 if (PrintBiasedLockingStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
396 BiasedLocking::print_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
397 }
9700
197426668a5d Enabled nmethod statistics for the HotSpot product build.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8156
diff changeset
398 if (PrintNMethodStatistics) {
197426668a5d Enabled nmethod statistics for the HotSpot product build.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8156
diff changeset
399 nmethod::print_statistics();
197426668a5d Enabled nmethod statistics for the HotSpot product build.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8156
diff changeset
400 }
6770
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
401
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
402 // Native memory tracking data
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
403 if (PrintNMTStatistics) {
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
404 if (MemTracker::is_on()) {
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
405 BaselineTTYOutputer outputer(tty);
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
406 MemTracker::print_memory_usage(outputer, K, false);
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
407 } else {
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
408 tty->print_cr(MemTracker::reason());
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
409 }
9a86ddfc6c8f 7188594: Print statistic collected by NMT with VM flag
zgu
parents: 6725
diff changeset
410 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
411 }
a61af66fc99e Initial load
duke
parents:
diff changeset
412
a61af66fc99e Initial load
duke
parents:
diff changeset
413 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
414
a61af66fc99e Initial load
duke
parents:
diff changeset
415
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // Helper class for registering on_exit calls through JVM_OnExit
a61af66fc99e Initial load
duke
parents:
diff changeset
417
a61af66fc99e Initial load
duke
parents:
diff changeset
418 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
419 typedef void (*__exit_proc)(void);
a61af66fc99e Initial load
duke
parents:
diff changeset
420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
421
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4800
diff changeset
422 class ExitProc : public CHeapObj<mtInternal> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
423 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
424 __exit_proc _proc;
a61af66fc99e Initial load
duke
parents:
diff changeset
425 // void (*_proc)(void);
a61af66fc99e Initial load
duke
parents:
diff changeset
426 ExitProc* _next;
a61af66fc99e Initial load
duke
parents:
diff changeset
427 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // ExitProc(void (*proc)(void)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
429 ExitProc(__exit_proc proc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
430 _proc = proc;
a61af66fc99e Initial load
duke
parents:
diff changeset
431 _next = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
432 }
a61af66fc99e Initial load
duke
parents:
diff changeset
433 void evaluate() { _proc(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
434 ExitProc* next() const { return _next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
435 void set_next(ExitProc* next) { _next = next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
436 };
a61af66fc99e Initial load
duke
parents:
diff changeset
437
a61af66fc99e Initial load
duke
parents:
diff changeset
438
a61af66fc99e Initial load
duke
parents:
diff changeset
439 // Linked list of registered on_exit procedures
a61af66fc99e Initial load
duke
parents:
diff changeset
440
a61af66fc99e Initial load
duke
parents:
diff changeset
441 static ExitProc* exit_procs = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
442
a61af66fc99e Initial load
duke
parents:
diff changeset
443
a61af66fc99e Initial load
duke
parents:
diff changeset
444 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
445 void register_on_exit_function(void (*func)(void)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
446 ExitProc *entry = new ExitProc(func);
a61af66fc99e Initial load
duke
parents:
diff changeset
447 // Classic vm does not throw an exception in case the allocation failed,
a61af66fc99e Initial load
duke
parents:
diff changeset
448 if (entry != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
449 entry->set_next(exit_procs);
a61af66fc99e Initial load
duke
parents:
diff changeset
450 exit_procs = entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
451 }
a61af66fc99e Initial load
duke
parents:
diff changeset
452 }
a61af66fc99e Initial load
duke
parents:
diff changeset
453 }
a61af66fc99e Initial load
duke
parents:
diff changeset
454
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // Note: before_exit() can be executed only once, if more than one threads
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // are trying to shutdown the VM at the same time, only one thread
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // can run before_exit() and all other threads must wait.
a61af66fc99e Initial load
duke
parents:
diff changeset
458 void before_exit(JavaThread * thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
459 #define BEFORE_EXIT_NOT_RUN 0
a61af66fc99e Initial load
duke
parents:
diff changeset
460 #define BEFORE_EXIT_RUNNING 1
a61af66fc99e Initial load
duke
parents:
diff changeset
461 #define BEFORE_EXIT_DONE 2
a61af66fc99e Initial load
duke
parents:
diff changeset
462 static jint volatile _before_exit_status = BEFORE_EXIT_NOT_RUN;
a61af66fc99e Initial load
duke
parents:
diff changeset
463
4319
3c21eee8ab4d Add installMethodCallback() to HotSpotRuntime.
Andreas Woess <andreas.woess@jku.at>
parents: 4137
diff changeset
464 #ifdef GRAAL
13174
b00553202ec2 add NULL check so that -Xint option works again
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13086
diff changeset
465 if (GraalCompiler::instance() != NULL) {
b00553202ec2 add NULL check so that -Xint option works again
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13086
diff changeset
466 GraalCompiler::instance()->exit();
b00553202ec2 add NULL check so that -Xint option works again
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13086
diff changeset
467 }
4319
3c21eee8ab4d Add installMethodCallback() to HotSpotRuntime.
Andreas Woess <andreas.woess@jku.at>
parents: 4137
diff changeset
468 #endif
2925
b78b4ae0757c Also call Compiler shutdown hook in case of System.exit call. Draft VMExits.Sandbox class.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2304
diff changeset
469
0
a61af66fc99e Initial load
duke
parents:
diff changeset
470 // Note: don't use a Mutex to guard the entire before_exit(), as
a61af66fc99e Initial load
duke
parents:
diff changeset
471 // JVMTI post_thread_end_event and post_vm_death_event will run native code.
a61af66fc99e Initial load
duke
parents:
diff changeset
472 // A CAS or OSMutex would work just fine but then we need to manipulate
a61af66fc99e Initial load
duke
parents:
diff changeset
473 // thread state for Safepoint. Here we use Monitor wait() and notify_all()
a61af66fc99e Initial load
duke
parents:
diff changeset
474 // for synchronization.
a61af66fc99e Initial load
duke
parents:
diff changeset
475 { MutexLocker ml(BeforeExit_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
476 switch (_before_exit_status) {
a61af66fc99e Initial load
duke
parents:
diff changeset
477 case BEFORE_EXIT_NOT_RUN:
a61af66fc99e Initial load
duke
parents:
diff changeset
478 _before_exit_status = BEFORE_EXIT_RUNNING;
a61af66fc99e Initial load
duke
parents:
diff changeset
479 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
480 case BEFORE_EXIT_RUNNING:
a61af66fc99e Initial load
duke
parents:
diff changeset
481 while (_before_exit_status == BEFORE_EXIT_RUNNING) {
a61af66fc99e Initial load
duke
parents:
diff changeset
482 BeforeExit_lock->wait();
a61af66fc99e Initial load
duke
parents:
diff changeset
483 }
a61af66fc99e Initial load
duke
parents:
diff changeset
484 assert(_before_exit_status == BEFORE_EXIT_DONE, "invalid state");
a61af66fc99e Initial load
duke
parents:
diff changeset
485 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
486 case BEFORE_EXIT_DONE:
a61af66fc99e Initial load
duke
parents:
diff changeset
487 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
488 }
a61af66fc99e Initial load
duke
parents:
diff changeset
489 }
a61af66fc99e Initial load
duke
parents:
diff changeset
490
a61af66fc99e Initial load
duke
parents:
diff changeset
491 // The only difference between this and Win32's _onexit procs is that
a61af66fc99e Initial load
duke
parents:
diff changeset
492 // this version is invoked before any threads get killed.
a61af66fc99e Initial load
duke
parents:
diff changeset
493 ExitProc* current = exit_procs;
a61af66fc99e Initial load
duke
parents:
diff changeset
494 while (current != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
495 ExitProc* next = current->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
496 current->evaluate();
a61af66fc99e Initial load
duke
parents:
diff changeset
497 delete current;
a61af66fc99e Initial load
duke
parents:
diff changeset
498 current = next;
a61af66fc99e Initial load
duke
parents:
diff changeset
499 }
a61af66fc99e Initial load
duke
parents:
diff changeset
500
a61af66fc99e Initial load
duke
parents:
diff changeset
501 // Hang forever on exit if we're reporting an error.
a61af66fc99e Initial load
duke
parents:
diff changeset
502 if (ShowMessageBoxOnError && is_error_reported()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
503 os::infinite_sleep();
a61af66fc99e Initial load
duke
parents:
diff changeset
504 }
a61af66fc99e Initial load
duke
parents:
diff changeset
505
a61af66fc99e Initial load
duke
parents:
diff changeset
506 // Terminate watcher thread - must before disenrolling any periodic task
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1644
diff changeset
507 if (PeriodicTask::num_tasks() > 0)
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1644
diff changeset
508 WatcherThread::stop();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
509
a61af66fc99e Initial load
duke
parents:
diff changeset
510 // Print statistics gathered (profiling ...)
a61af66fc99e Initial load
duke
parents:
diff changeset
511 if (Arguments::has_profile()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
512 FlatProfiler::disengage();
a61af66fc99e Initial load
duke
parents:
diff changeset
513 FlatProfiler::print(10);
a61af66fc99e Initial load
duke
parents:
diff changeset
514 }
a61af66fc99e Initial load
duke
parents:
diff changeset
515
a61af66fc99e Initial load
duke
parents:
diff changeset
516 // shut down the StatSampler task
a61af66fc99e Initial load
duke
parents:
diff changeset
517 StatSampler::disengage();
a61af66fc99e Initial load
duke
parents:
diff changeset
518 StatSampler::destroy();
a61af66fc99e Initial load
duke
parents:
diff changeset
519
3769
ef2d1b8f2dd4 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 2304
diff changeset
520 // 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
521 // 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
522 // 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
523 // Threads::destroy_vm().
0
a61af66fc99e Initial load
duke
parents:
diff changeset
524
a61af66fc99e Initial load
duke
parents:
diff changeset
525 // Print GC/heap related information.
a61af66fc99e Initial load
duke
parents:
diff changeset
526 if (PrintGCDetails) {
a61af66fc99e Initial load
duke
parents:
diff changeset
527 Universe::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
528 AdaptiveSizePolicyOutput(0);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
529 if (Verbose) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
530 ClassLoaderDataGraph::dump_on(gclog_or_tty);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
531 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
532 }
a61af66fc99e Initial load
duke
parents:
diff changeset
533
a61af66fc99e Initial load
duke
parents:
diff changeset
534 if (PrintBytecodeHistogram) {
a61af66fc99e Initial load
duke
parents:
diff changeset
535 BytecodeHistogram::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
536 }
a61af66fc99e Initial load
duke
parents:
diff changeset
537
a61af66fc99e Initial load
duke
parents:
diff changeset
538 if (JvmtiExport::should_post_thread_life()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
539 JvmtiExport::post_thread_end(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
540 }
4800
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4006
diff changeset
541
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 8001
diff changeset
542
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 8001
diff changeset
543 EventThreadEnd event;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 8001
diff changeset
544 if (event.should_commit()) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 8001
diff changeset
545 event.set_javalangthread(java_lang_Thread::thread_id(thread->threadObj()));
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 8001
diff changeset
546 event.commit();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 8001
diff changeset
547 }
4800
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4006
diff changeset
548
0
a61af66fc99e Initial load
duke
parents:
diff changeset
549 // Always call even when there are not JVMTI environments yet, since environments
a61af66fc99e Initial load
duke
parents:
diff changeset
550 // may be attached late and JVMTI must track phases of VM execution
a61af66fc99e Initial load
duke
parents:
diff changeset
551 JvmtiExport::post_vm_death();
a61af66fc99e Initial load
duke
parents:
diff changeset
552 Threads::shutdown_vm_agents();
a61af66fc99e Initial load
duke
parents:
diff changeset
553
a61af66fc99e Initial load
duke
parents:
diff changeset
554 // Terminate the signal thread
a61af66fc99e Initial load
duke
parents:
diff changeset
555 // Note: we don't wait until it actually dies.
a61af66fc99e Initial load
duke
parents:
diff changeset
556 os::terminate_signal_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
557
a61af66fc99e Initial load
duke
parents:
diff changeset
558 print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
559 Universe::heap()->print_tracing_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
560
a61af66fc99e Initial load
duke
parents:
diff changeset
561 { MutexLocker ml(BeforeExit_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
562 _before_exit_status = BEFORE_EXIT_DONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
563 BeforeExit_lock->notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
564 }
a61af66fc99e Initial load
duke
parents:
diff changeset
565
7585
e0cf9af8978e 8005936: PrintNMTStatistics doesn't work for normal JVM exit
zgu
parents: 7180
diff changeset
566 // Shutdown NMT before exit. Otherwise,
e0cf9af8978e 8005936: PrintNMTStatistics doesn't work for normal JVM exit
zgu
parents: 7180
diff changeset
567 // it will run into trouble when system destroys static variables.
e0cf9af8978e 8005936: PrintNMTStatistics doesn't work for normal JVM exit
zgu
parents: 7180
diff changeset
568 MemTracker::shutdown(MemTracker::NMT_normal);
e0cf9af8978e 8005936: PrintNMTStatistics doesn't work for normal JVM exit
zgu
parents: 7180
diff changeset
569
12275
63147986a428 8019835: Strings interned in different threads equal but does not ==
dcubed
parents: 11096
diff changeset
570 if (VerifyStringTableAtExit) {
63147986a428 8019835: Strings interned in different threads equal but does not ==
dcubed
parents: 11096
diff changeset
571 int fail_cnt = 0;
63147986a428 8019835: Strings interned in different threads equal but does not ==
dcubed
parents: 11096
diff changeset
572 {
63147986a428 8019835: Strings interned in different threads equal but does not ==
dcubed
parents: 11096
diff changeset
573 MutexLocker ml(StringTable_lock);
63147986a428 8019835: Strings interned in different threads equal but does not ==
dcubed
parents: 11096
diff changeset
574 fail_cnt = StringTable::verify_and_compare_entries();
63147986a428 8019835: Strings interned in different threads equal but does not ==
dcubed
parents: 11096
diff changeset
575 }
63147986a428 8019835: Strings interned in different threads equal but does not ==
dcubed
parents: 11096
diff changeset
576
63147986a428 8019835: Strings interned in different threads equal but does not ==
dcubed
parents: 11096
diff changeset
577 if (fail_cnt != 0) {
63147986a428 8019835: Strings interned in different threads equal but does not ==
dcubed
parents: 11096
diff changeset
578 tty->print_cr("ERROR: fail_cnt=%d", fail_cnt);
63147986a428 8019835: Strings interned in different threads equal but does not ==
dcubed
parents: 11096
diff changeset
579 guarantee(fail_cnt == 0, "unexpected StringTable verification failures");
63147986a428 8019835: Strings interned in different threads equal but does not ==
dcubed
parents: 11096
diff changeset
580 }
63147986a428 8019835: Strings interned in different threads equal but does not ==
dcubed
parents: 11096
diff changeset
581 }
63147986a428 8019835: Strings interned in different threads equal but does not ==
dcubed
parents: 11096
diff changeset
582
0
a61af66fc99e Initial load
duke
parents:
diff changeset
583 #undef BEFORE_EXIT_NOT_RUN
a61af66fc99e Initial load
duke
parents:
diff changeset
584 #undef BEFORE_EXIT_RUNNING
a61af66fc99e Initial load
duke
parents:
diff changeset
585 #undef BEFORE_EXIT_DONE
a61af66fc99e Initial load
duke
parents:
diff changeset
586 }
a61af66fc99e Initial load
duke
parents:
diff changeset
587
a61af66fc99e Initial load
duke
parents:
diff changeset
588 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
589 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
590 ThreadLocalStorage::get_thread_slow() : NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
591 if (thread == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
592 // we have serious problems -- just exit
a61af66fc99e Initial load
duke
parents:
diff changeset
593 vm_direct_exit(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
594 }
a61af66fc99e Initial load
duke
parents:
diff changeset
595
a61af66fc99e Initial load
duke
parents:
diff changeset
596 if (VMThread::vm_thread() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
597 // Fire off a VM_Exit operation to bring VM to a safepoint and exit
a61af66fc99e Initial load
duke
parents:
diff changeset
598 VM_Exit op(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
599 if (thread->is_Java_thread())
a61af66fc99e Initial load
duke
parents:
diff changeset
600 ((JavaThread*)thread)->set_thread_state(_thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
601 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
602 // should never reach here; but in case something wrong with VM Thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
603 vm_direct_exit(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
604 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
605 // VM thread is gone, just exit
a61af66fc99e Initial load
duke
parents:
diff changeset
606 vm_direct_exit(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
607 }
a61af66fc99e Initial load
duke
parents:
diff changeset
608 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
609 }
a61af66fc99e Initial load
duke
parents:
diff changeset
610
a61af66fc99e Initial load
duke
parents:
diff changeset
611 void notify_vm_shutdown() {
a61af66fc99e Initial load
duke
parents:
diff changeset
612 // For now, just a dtrace probe.
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
613 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
614 HS_DTRACE_PROBE(hotspot, vm__shutdown);
1547
fb1a39993f69 6951319: enable solaris builds using Sun Studio 12 update 1
jcoomes
parents: 242
diff changeset
615 HS_DTRACE_WORKAROUND_TAIL_CALL_BUG();
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
616 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
617 HOTSPOT_VM_SHUTDOWN();
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
618 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
619 }
a61af66fc99e Initial load
duke
parents:
diff changeset
620
a61af66fc99e Initial load
duke
parents:
diff changeset
621 void vm_direct_exit(int code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
622 notify_vm_shutdown();
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 ::exit(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
625 }
a61af66fc99e Initial load
duke
parents:
diff changeset
626
a61af66fc99e Initial load
duke
parents:
diff changeset
627 void vm_perform_shutdown_actions() {
a61af66fc99e Initial load
duke
parents:
diff changeset
628 // Warning: do not call 'exit_globals()' here. All threads are still running.
a61af66fc99e Initial load
duke
parents:
diff changeset
629 // Calling 'exit_globals()' will disable thread-local-storage and cause all
a61af66fc99e Initial load
duke
parents:
diff changeset
630 // kinds of assertions to trigger in debug mode.
a61af66fc99e Initial load
duke
parents:
diff changeset
631 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
632 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
633 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
634 if (thread != NULL && thread->is_Java_thread()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
635 // We are leaving the VM, set state to native (in case any OS exit
a61af66fc99e Initial load
duke
parents:
diff changeset
636 // handlers call back to the VM)
a61af66fc99e Initial load
duke
parents:
diff changeset
637 JavaThread* jt = (JavaThread*)thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
638 // Must always be walkable or have no last_Java_frame when in
a61af66fc99e Initial load
duke
parents:
diff changeset
639 // thread_in_native
a61af66fc99e Initial load
duke
parents:
diff changeset
640 jt->frame_anchor()->make_walkable(jt);
a61af66fc99e Initial load
duke
parents:
diff changeset
641 jt->set_thread_state(_thread_in_native);
a61af66fc99e Initial load
duke
parents:
diff changeset
642 }
a61af66fc99e Initial load
duke
parents:
diff changeset
643 }
a61af66fc99e Initial load
duke
parents:
diff changeset
644 notify_vm_shutdown();
a61af66fc99e Initial load
duke
parents:
diff changeset
645 }
a61af66fc99e Initial load
duke
parents:
diff changeset
646
a61af66fc99e Initial load
duke
parents:
diff changeset
647 void vm_shutdown()
a61af66fc99e Initial load
duke
parents:
diff changeset
648 {
a61af66fc99e Initial load
duke
parents:
diff changeset
649 vm_perform_shutdown_actions();
2302
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2192
diff changeset
650 os::wait_for_keypress_at_exit();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
651 os::shutdown();
a61af66fc99e Initial load
duke
parents:
diff changeset
652 }
a61af66fc99e Initial load
duke
parents:
diff changeset
653
227
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
654 void vm_abort(bool dump_core) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
655 vm_perform_shutdown_actions();
2302
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2192
diff changeset
656 os::wait_for_keypress_at_exit();
227
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
657 os::abort(dump_core);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
658 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
659 }
a61af66fc99e Initial load
duke
parents:
diff changeset
660
a61af66fc99e Initial load
duke
parents:
diff changeset
661 void vm_notify_during_shutdown(const char* error, const char* message) {
a61af66fc99e Initial load
duke
parents:
diff changeset
662 if (error != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
663 tty->print_cr("Error occurred during initialization of VM");
a61af66fc99e Initial load
duke
parents:
diff changeset
664 tty->print("%s", error);
a61af66fc99e Initial load
duke
parents:
diff changeset
665 if (message != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
666 tty->print_cr(": %s", message);
a61af66fc99e Initial load
duke
parents:
diff changeset
667 }
a61af66fc99e Initial load
duke
parents:
diff changeset
668 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
669 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
670 }
a61af66fc99e Initial load
duke
parents:
diff changeset
671 }
a61af66fc99e Initial load
duke
parents:
diff changeset
672 if (ShowMessageBoxOnError && WizardMode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
673 fatal("Error occurred during initialization of VM");
a61af66fc99e Initial load
duke
parents:
diff changeset
674 }
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(Handle exception) {
a61af66fc99e Initial load
duke
parents:
diff changeset
678 tty->print_cr("Error occurred during initialization of VM");
a61af66fc99e Initial load
duke
parents:
diff changeset
679 // If there are exceptions on this thread it must be cleared
a61af66fc99e Initial load
duke
parents:
diff changeset
680 // first and here. Any future calls to EXCEPTION_MARK requires
a61af66fc99e Initial load
duke
parents:
diff changeset
681 // that no pending exceptions exist.
a61af66fc99e Initial load
duke
parents:
diff changeset
682 Thread *THREAD = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
683 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
684 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
685 }
a61af66fc99e Initial load
duke
parents:
diff changeset
686 java_lang_Throwable::print(exception, tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
687 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
688 java_lang_Throwable::print_stack_trace(exception(), tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
689 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
690 vm_notify_during_shutdown(NULL, NULL);
227
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
691
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
692 // 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
693 vm_abort(false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
694 }
a61af66fc99e Initial load
duke
parents:
diff changeset
695
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2129
diff changeset
696 void vm_exit_during_initialization(Symbol* ex, const char* message) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
697 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
698 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
699
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
700 // 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
701 vm_abort(false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
702 }
a61af66fc99e Initial load
duke
parents:
diff changeset
703
a61af66fc99e Initial load
duke
parents:
diff changeset
704 void vm_exit_during_initialization(const char* error, const char* message) {
a61af66fc99e Initial load
duke
parents:
diff changeset
705 vm_notify_during_shutdown(error, message);
227
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
706
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
707 // 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
708 vm_abort(false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
709 }
a61af66fc99e Initial load
duke
parents:
diff changeset
710
a61af66fc99e Initial load
duke
parents:
diff changeset
711 void vm_shutdown_during_initialization(const char* error, const char* message) {
a61af66fc99e Initial load
duke
parents:
diff changeset
712 vm_notify_during_shutdown(error, message);
a61af66fc99e Initial load
duke
parents:
diff changeset
713 vm_shutdown();
a61af66fc99e Initial load
duke
parents:
diff changeset
714 }
a61af66fc99e Initial load
duke
parents:
diff changeset
715
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
716 JDK_Version JDK_Version::_current;
6181
f8de958e5b2c 7176856: add the JRE name to the error log
twisti
parents: 4800
diff changeset
717 const char* JDK_Version::_runtime_name;
6921
a1b8cf9cf970 8002078: hs_err_pid file should report full JDK version string
sla
parents: 6770
diff changeset
718 const char* JDK_Version::_runtime_version;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
719
a61af66fc99e Initial load
duke
parents:
diff changeset
720 void JDK_Version::initialize() {
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
721 jdk_version_info info;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
722 assert(!_current.is_valid(), "Don't initialize twice");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
723
0
a61af66fc99e Initial load
duke
parents:
diff changeset
724 void *lib_handle = os::native_java_library();
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
725 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
726 os::dll_lookup(lib_handle, "JDK_GetVersionInfo0"));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
727
a61af66fc99e Initial load
duke
parents:
diff changeset
728 if (func == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
729 // JDK older than 1.6
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
730 _current._partially_initialized = true;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
731 } else {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
732 (*func)(&info, sizeof(info));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
733
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
734 int major = JDK_VERSION_MAJOR(info.jdk_version);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
735 int minor = JDK_VERSION_MINOR(info.jdk_version);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
736 int micro = JDK_VERSION_MICRO(info.jdk_version);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
737 int build = JDK_VERSION_BUILD(info.jdk_version);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
738 if (major == 1 && minor > 4) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
739 // 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
740 major = minor;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
741 minor = micro;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
742 micro = 0;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
743 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
744 _current = JDK_Version(major, minor, micro, info.update_version,
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
745 info.special_update_version, build,
2129
8f8dfba37802 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 2096
diff changeset
746 info.thread_park_blocker == 1,
3917
eca1193ca245 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 3841
diff changeset
747 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
748 info.pending_list_uses_discovered_field == 1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
749 }
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
750 }
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 void JDK_Version::fully_initialize(
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
753 uint8_t major, uint8_t minor, uint8_t micro, uint8_t update) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
754 // 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
755 // far enough in the initialization to determine the exact version.
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
756 assert(major < 6, "not needed for JDK version >= 6");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
757 assert(is_partially_initialized(), "must not initialize");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
758 if (major < 5) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
759 // 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
760 micro = minor;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
761 minor = major;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
762 major = 1;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
763 }
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
764 _current = JDK_Version(major, minor, micro, update);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
765 }
a61af66fc99e Initial load
duke
parents:
diff changeset
766
a61af66fc99e Initial load
duke
parents:
diff changeset
767 void JDK_Version_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
768 JDK_Version::initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
769 }
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
770
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
771 static int64_t encode_jdk_version(const JDK_Version& v) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
772 return
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
773 ((int64_t)v.major_version() << (BitsPerByte * 5)) |
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
774 ((int64_t)v.minor_version() << (BitsPerByte * 4)) |
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
775 ((int64_t)v.micro_version() << (BitsPerByte * 3)) |
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
776 ((int64_t)v.update_version() << (BitsPerByte * 2)) |
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
777 ((int64_t)v.special_update_version() << (BitsPerByte * 1)) |
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
778 ((int64_t)v.build_number() << (BitsPerByte * 0));
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
779 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
780
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
781 int JDK_Version::compare(const JDK_Version& other) const {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
782 assert(is_valid() && other.is_valid(), "Invalid version (uninitialized?)");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
783 if (!is_partially_initialized() && other.is_partially_initialized()) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
784 return -(other.compare(*this)); // flip the comparators
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
785 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
786 assert(!other.is_partially_initialized(), "Not initialized yet");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
787 if (is_partially_initialized()) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
788 assert(other.major_version() >= 6,
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
789 "Invalid JDK version comparison during initialization");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
790 return -1;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
791 } else {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
792 uint64_t e = encode_jdk_version(*this);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
793 uint64_t o = encode_jdk_version(other);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
794 return (e > o) ? 1 : ((e == o) ? 0 : -1);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
795 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
796 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
797
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
798 void JDK_Version::to_string(char* buffer, size_t buflen) const {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
799 size_t index = 0;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
800 if (!is_valid()) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
801 jio_snprintf(buffer, buflen, "%s", "(uninitialized)");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
802 } else if (is_partially_initialized()) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
803 jio_snprintf(buffer, buflen, "%s", "(uninitialized) pre-1.6.0");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
804 } else {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
805 index += jio_snprintf(
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
806 &buffer[index], buflen - index, "%d.%d", _major, _minor);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
807 if (_micro > 0) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
808 index += jio_snprintf(&buffer[index], buflen - index, ".%d", _micro);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
809 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
810 if (_update > 0) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
811 index += jio_snprintf(&buffer[index], buflen - index, "_%02d", _update);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
812 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
813 if (_special > 0) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
814 index += jio_snprintf(&buffer[index], buflen - index, "%c", _special);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
815 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
816 if (_build > 0) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
817 index += jio_snprintf(&buffer[index], buflen - index, "-b%02d", _build);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
818 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
819 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
820 }