annotate src/share/vm/runtime/vm_operations.hpp @ 9126:bc26f978b0ce

HotSpotResolvedObjectType: implement hasFinalizeSubclass() correctly don't use the (wrong) cached value, but ask the runtime on each request. Fixes regression on xml.* benchmarks @ specjvm2008. The problem was: After the constructor of Object was deoptimized due to an assumption violation, it was recompiled again after some time. However, on recompilation, the value of hasFinalizeSubclass for the class was not updated and it was compiled again with a, now wrong, assumption, which then triggers deoptimization again. This was repeated until it hit the recompilation limit (defined by PerMethodRecompilationCutoff), and therefore only executed by the interpreter from now on, causing the performance regression.
author Bernhard Urban <bernhard.urban@jku.at>
date Mon, 15 Apr 2013 19:54:58 +0200
parents 89e4d67fdd2a
children 836a62f43af9
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: 6197
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: 1202
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1202
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: 1202
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: 1905
diff changeset
25 #ifndef SHARE_VM_RUNTIME_VM_OPERATIONS_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
26 #define SHARE_VM_RUNTIME_VM_OPERATIONS_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
28 #include "classfile/javaClasses.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
29 #include "memory/allocation.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
30 #include "oops/oop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
31 #include "runtime/thread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
32 #include "utilities/top.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
33
0
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // The following classes are used for operations
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // initiated by a Java thread but that must
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // take place in the VMThread.
a61af66fc99e Initial load
duke
parents:
diff changeset
37
a61af66fc99e Initial load
duke
parents:
diff changeset
38 #define VM_OP_ENUM(type) VMOp_##type,
a61af66fc99e Initial load
duke
parents:
diff changeset
39
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // Note: When new VM_XXX comes up, add 'XXX' to the template table.
a61af66fc99e Initial load
duke
parents:
diff changeset
41 #define VM_OPS_DO(template) \
a61af66fc99e Initial load
duke
parents:
diff changeset
42 template(Dummy) \
a61af66fc99e Initial load
duke
parents:
diff changeset
43 template(ThreadStop) \
a61af66fc99e Initial load
duke
parents:
diff changeset
44 template(ThreadDump) \
a61af66fc99e Initial load
duke
parents:
diff changeset
45 template(PrintThreads) \
a61af66fc99e Initial load
duke
parents:
diff changeset
46 template(FindDeadlocks) \
a61af66fc99e Initial load
duke
parents:
diff changeset
47 template(ForceSafepoint) \
a61af66fc99e Initial load
duke
parents:
diff changeset
48 template(ForceAsyncSafepoint) \
a61af66fc99e Initial load
duke
parents:
diff changeset
49 template(Deoptimize) \
a61af66fc99e Initial load
duke
parents:
diff changeset
50 template(DeoptimizeFrame) \
a61af66fc99e Initial load
duke
parents:
diff changeset
51 template(DeoptimizeAll) \
a61af66fc99e Initial load
duke
parents:
diff changeset
52 template(ZombieAll) \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
53 template(UnlinkSymbols) \
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 844
diff changeset
54 template(HandleFullCodeCache) \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
55 template(Verify) \
a61af66fc99e Initial load
duke
parents:
diff changeset
56 template(PrintJNI) \
a61af66fc99e Initial load
duke
parents:
diff changeset
57 template(HeapDumper) \
a61af66fc99e Initial load
duke
parents:
diff changeset
58 template(DeoptimizeTheWorld) \
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
59 template(CollectForMetadataAllocation) \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
60 template(GC_HeapInspection) \
a61af66fc99e Initial load
duke
parents:
diff changeset
61 template(GenCollectFull) \
a61af66fc99e Initial load
duke
parents:
diff changeset
62 template(GenCollectFullConcurrent) \
a61af66fc99e Initial load
duke
parents:
diff changeset
63 template(GenCollectForAllocation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
64 template(ParallelGCFailedAllocation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
65 template(ParallelGCSystemGC) \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 139
diff changeset
66 template(CGC_Operation) \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
67 template(CMS_Initial_Mark) \
a61af66fc99e Initial load
duke
parents:
diff changeset
68 template(CMS_Final_Remark) \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 139
diff changeset
69 template(G1CollectFull) \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 139
diff changeset
70 template(G1CollectForAllocation) \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 139
diff changeset
71 template(G1IncCollectionPause) \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
72 template(EnableBiasedLocking) \
a61af66fc99e Initial load
duke
parents:
diff changeset
73 template(RevokeBias) \
a61af66fc99e Initial load
duke
parents:
diff changeset
74 template(BulkRevokeBias) \
a61af66fc99e Initial load
duke
parents:
diff changeset
75 template(PopulateDumpSharedSpace) \
a61af66fc99e Initial load
duke
parents:
diff changeset
76 template(JNIFunctionTableCopier) \
a61af66fc99e Initial load
duke
parents:
diff changeset
77 template(RedefineClasses) \
a61af66fc99e Initial load
duke
parents:
diff changeset
78 template(GetOwnedMonitorInfo) \
a61af66fc99e Initial load
duke
parents:
diff changeset
79 template(GetObjectMonitorUsage) \
a61af66fc99e Initial load
duke
parents:
diff changeset
80 template(GetCurrentContendedMonitor) \
a61af66fc99e Initial load
duke
parents:
diff changeset
81 template(GetStackTrace) \
a61af66fc99e Initial load
duke
parents:
diff changeset
82 template(GetMultipleStackTraces) \
a61af66fc99e Initial load
duke
parents:
diff changeset
83 template(GetAllStackTraces) \
a61af66fc99e Initial load
duke
parents:
diff changeset
84 template(GetThreadListStackTraces) \
a61af66fc99e Initial load
duke
parents:
diff changeset
85 template(GetFrameCount) \
a61af66fc99e Initial load
duke
parents:
diff changeset
86 template(GetFrameLocation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
87 template(ChangeBreakpoints) \
a61af66fc99e Initial load
duke
parents:
diff changeset
88 template(GetOrSetLocal) \
a61af66fc99e Initial load
duke
parents:
diff changeset
89 template(GetCurrentLocation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
90 template(EnterInterpOnlyMode) \
a61af66fc99e Initial load
duke
parents:
diff changeset
91 template(ChangeSingleStep) \
a61af66fc99e Initial load
duke
parents:
diff changeset
92 template(HeapWalkOperation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
93 template(HeapIterateOperation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
94 template(ReportJavaOutOfMemory) \
4800
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 2426
diff changeset
95 template(JFRCheckpoint) \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
96 template(Exit) \
8710
9058789475af 7107135: Stack guard pages are no more protected after loading a shared library with executable stack
iklam
parents: 6725
diff changeset
97 template(LinuxDllLoad) \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
98
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4800
diff changeset
99 class VM_Operation: public CHeapObj<mtInternal> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
100 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
101 enum Mode {
a61af66fc99e Initial load
duke
parents:
diff changeset
102 _safepoint, // blocking, safepoint, vm_op C-heap allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
103 _no_safepoint, // blocking, no safepoint, vm_op C-Heap allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
104 _concurrent, // non-blocking, no safepoint, vm_op C-Heap allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
105 _async_safepoint // non-blocking, safepoint, vm_op C-Heap allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
106 };
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 enum VMOp_Type {
a61af66fc99e Initial load
duke
parents:
diff changeset
109 VM_OPS_DO(VM_OP_ENUM)
a61af66fc99e Initial load
duke
parents:
diff changeset
110 VMOp_Terminating
a61af66fc99e Initial load
duke
parents:
diff changeset
111 };
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
114 Thread* _calling_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
115 ThreadPriority _priority;
a61af66fc99e Initial load
duke
parents:
diff changeset
116 long _timestamp;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 VM_Operation* _next;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 VM_Operation* _prev;
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // The VM operation name array
a61af66fc99e Initial load
duke
parents:
diff changeset
121 static const char* _names[];
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
124 VM_Operation() { _calling_thread = NULL; _next = NULL; _prev = NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
125 virtual ~VM_Operation() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
126
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // VM operation support (used by VM thread)
a61af66fc99e Initial load
duke
parents:
diff changeset
128 Thread* calling_thread() const { return _calling_thread; }
a61af66fc99e Initial load
duke
parents:
diff changeset
129 ThreadPriority priority() { return _priority; }
a61af66fc99e Initial load
duke
parents:
diff changeset
130 void set_calling_thread(Thread* thread, ThreadPriority priority);
a61af66fc99e Initial load
duke
parents:
diff changeset
131
a61af66fc99e Initial load
duke
parents:
diff changeset
132 long timestamp() const { return _timestamp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
133 void set_timestamp(long timestamp) { _timestamp = timestamp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135 // Called by VM thread - does in turn invoke doit(). Do not override this
a61af66fc99e Initial load
duke
parents:
diff changeset
136 void evaluate();
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // evaluate() is called by the VMThread and in turn calls doit().
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // If the thread invoking VMThread::execute((VM_Operation*) is a JavaThread,
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // doit_prologue() is called in that thread before transferring control to
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // the VMThread.
a61af66fc99e Initial load
duke
parents:
diff changeset
142 // If doit_prologue() returns true the VM operation will proceed, and
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // doit_epilogue() will be called by the JavaThread once the VM operation
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // completes. If doit_prologue() returns false the VM operation is cancelled.
a61af66fc99e Initial load
duke
parents:
diff changeset
145 virtual void doit() = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
146 virtual bool doit_prologue() { return true; };
a61af66fc99e Initial load
duke
parents:
diff changeset
147 virtual void doit_epilogue() {}; // Note: Not called if mode is: _concurrent
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // Type test
a61af66fc99e Initial load
duke
parents:
diff changeset
150 virtual bool is_methodCompiler() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
151
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // Linking
a61af66fc99e Initial load
duke
parents:
diff changeset
153 VM_Operation *next() const { return _next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
154 VM_Operation *prev() const { return _prev; }
a61af66fc99e Initial load
duke
parents:
diff changeset
155 void set_next(VM_Operation *next) { _next = next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
156 void set_prev(VM_Operation *prev) { _prev = prev; }
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // Configuration. Override these appropriatly in subclasses.
a61af66fc99e Initial load
duke
parents:
diff changeset
159 virtual VMOp_Type type() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
160 virtual Mode evaluation_mode() const { return _safepoint; }
a61af66fc99e Initial load
duke
parents:
diff changeset
161 virtual bool allow_nested_vm_operations() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
162 virtual bool is_cheap_allocated() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
163 virtual void oops_do(OopClosure* f) { /* do nothing */ };
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // CAUTION: <don't hang yourself with following rope>
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // If you override these methods, make sure that the evaluation
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // of these methods is race-free and non-blocking, since these
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // methods may be evaluated either by the mutators or by the
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // vm thread, either concurrently with mutators or with the mutators
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // stopped. In other words, taking locks is verboten, and if there
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // are any races in evaluating the conditions, they'd better be benign.
a61af66fc99e Initial load
duke
parents:
diff changeset
172 virtual bool evaluate_at_safepoint() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
173 return evaluation_mode() == _safepoint ||
a61af66fc99e Initial load
duke
parents:
diff changeset
174 evaluation_mode() == _async_safepoint;
a61af66fc99e Initial load
duke
parents:
diff changeset
175 }
a61af66fc99e Initial load
duke
parents:
diff changeset
176 virtual bool evaluate_concurrently() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
177 return evaluation_mode() == _concurrent ||
a61af66fc99e Initial load
duke
parents:
diff changeset
178 evaluation_mode() == _async_safepoint;
a61af66fc99e Initial load
duke
parents:
diff changeset
179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 // Debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
182 void print_on_error(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
183 const char* name() const { return _names[type()]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
184 static const char* name(int type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
185 assert(type >= 0 && type < VMOp_Terminating, "invalid VM operation type");
a61af66fc99e Initial load
duke
parents:
diff changeset
186 return _names[type];
a61af66fc99e Initial load
duke
parents:
diff changeset
187 }
a61af66fc99e Initial load
duke
parents:
diff changeset
188 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
189 void print_on(outputStream* st) const { print_on_error(st); }
a61af66fc99e Initial load
duke
parents:
diff changeset
190 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
191 };
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 class VM_ThreadStop: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
194 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
195 oop _thread; // The Thread that the Throwable is thrown against
a61af66fc99e Initial load
duke
parents:
diff changeset
196 oop _throwable; // The Throwable thrown at the target Thread
a61af66fc99e Initial load
duke
parents:
diff changeset
197 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
198 // All oops are passed as JNI handles, since there is no guarantee that a GC might happen before the
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // VM operation is executed.
a61af66fc99e Initial load
duke
parents:
diff changeset
200 VM_ThreadStop(oop thread, oop throwable) {
a61af66fc99e Initial load
duke
parents:
diff changeset
201 _thread = thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
202 _throwable = throwable;
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204 VMOp_Type type() const { return VMOp_ThreadStop; }
a61af66fc99e Initial load
duke
parents:
diff changeset
205 oop target_thread() const { return _thread; }
a61af66fc99e Initial load
duke
parents:
diff changeset
206 oop throwable() const { return _throwable;}
a61af66fc99e Initial load
duke
parents:
diff changeset
207 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // We deoptimize if top-most frame is compiled - this might require a C2I adapter to be generated
a61af66fc99e Initial load
duke
parents:
diff changeset
209 bool allow_nested_vm_operations() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
210 Mode evaluation_mode() const { return _async_safepoint; }
a61af66fc99e Initial load
duke
parents:
diff changeset
211 bool is_cheap_allocated() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // GC support
a61af66fc99e Initial load
duke
parents:
diff changeset
214 void oops_do(OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
215 f->do_oop(&_thread); f->do_oop(&_throwable);
a61af66fc99e Initial load
duke
parents:
diff changeset
216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
217 };
a61af66fc99e Initial load
duke
parents:
diff changeset
218
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // dummy vm op, evaluated just to force a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
220 class VM_ForceSafepoint: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
221 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
222 VM_ForceSafepoint() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
223 void doit() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
224 VMOp_Type type() const { return VMOp_ForceSafepoint; }
a61af66fc99e Initial load
duke
parents:
diff changeset
225 };
a61af66fc99e Initial load
duke
parents:
diff changeset
226
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // dummy vm op, evaluated just to force a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
228 class VM_ForceAsyncSafepoint: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
229 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
230 VM_ForceAsyncSafepoint() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
231 void doit() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
232 VMOp_Type type() const { return VMOp_ForceAsyncSafepoint; }
a61af66fc99e Initial load
duke
parents:
diff changeset
233 Mode evaluation_mode() const { return _async_safepoint; }
a61af66fc99e Initial load
duke
parents:
diff changeset
234 bool is_cheap_allocated() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
235 };
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237 class VM_Deoptimize: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
238 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
239 VM_Deoptimize() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
240 VMOp_Type type() const { return VMOp_Deoptimize; }
a61af66fc99e Initial load
duke
parents:
diff changeset
241 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
242 bool allow_nested_vm_operations() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
243 };
a61af66fc99e Initial load
duke
parents:
diff changeset
244
1905
ce6848d0666d 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents: 1552
diff changeset
245
ce6848d0666d 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents: 1552
diff changeset
246 // Deopt helper that can deoptimize frames in threads other than the
ce6848d0666d 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents: 1552
diff changeset
247 // current thread. Only used through Deoptimization::deoptimize_frame.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
248 class VM_DeoptimizeFrame: public VM_Operation {
1905
ce6848d0666d 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents: 1552
diff changeset
249 friend class Deoptimization;
ce6848d0666d 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents: 1552
diff changeset
250
0
a61af66fc99e Initial load
duke
parents:
diff changeset
251 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
252 JavaThread* _thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
253 intptr_t* _id;
5110
0ebca2e35ca5 more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4800
diff changeset
254 int _reason;
0ebca2e35ca5 more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4800
diff changeset
255 VM_DeoptimizeFrame(JavaThread* thread, intptr_t* id, int reason);
1905
ce6848d0666d 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents: 1552
diff changeset
256
0
a61af66fc99e Initial load
duke
parents:
diff changeset
257 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
258 VMOp_Type type() const { return VMOp_DeoptimizeFrame; }
a61af66fc99e Initial load
duke
parents:
diff changeset
259 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
260 bool allow_nested_vm_operations() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
261 };
a61af66fc99e Initial load
duke
parents:
diff changeset
262
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 844
diff changeset
263 class VM_HandleFullCodeCache: public VM_Operation {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 844
diff changeset
264 private:
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 844
diff changeset
265 bool _is_full;
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 844
diff changeset
266 public:
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 844
diff changeset
267 VM_HandleFullCodeCache(bool is_full) { _is_full = is_full; }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 844
diff changeset
268 VMOp_Type type() const { return VMOp_HandleFullCodeCache; }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 844
diff changeset
269 void doit();
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 844
diff changeset
270 bool allow_nested_vm_operations() const { return true; }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 844
diff changeset
271 };
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 844
diff changeset
272
0
a61af66fc99e Initial load
duke
parents:
diff changeset
273 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
274 class VM_DeoptimizeAll: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
275 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
276 KlassHandle _dependee;
a61af66fc99e Initial load
duke
parents:
diff changeset
277 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
278 VM_DeoptimizeAll() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
279 VMOp_Type type() const { return VMOp_DeoptimizeAll; }
a61af66fc99e Initial load
duke
parents:
diff changeset
280 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
281 bool allow_nested_vm_operations() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
282 };
a61af66fc99e Initial load
duke
parents:
diff changeset
283
a61af66fc99e Initial load
duke
parents:
diff changeset
284
a61af66fc99e Initial load
duke
parents:
diff changeset
285 class VM_ZombieAll: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
286 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
287 VM_ZombieAll() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
288 VMOp_Type type() const { return VMOp_ZombieAll; }
a61af66fc99e Initial load
duke
parents:
diff changeset
289 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
290 bool allow_nested_vm_operations() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
291 };
a61af66fc99e Initial load
duke
parents:
diff changeset
292 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
293
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
294 class VM_UnlinkSymbols: public VM_Operation {
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
295 public:
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
296 VM_UnlinkSymbols() {}
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
297 VMOp_Type type() const { return VMOp_UnlinkSymbols; }
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
298 void doit();
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
299 bool allow_nested_vm_operations() const { return true; }
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
300 };
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
301
0
a61af66fc99e Initial load
duke
parents:
diff changeset
302 class VM_Verify: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
303 private:
9071
68fe50d4f1d5 8011343: Add new flag for verifying the heap during startup
johnc
parents: 8710
diff changeset
304 bool _silent;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
305 public:
9071
68fe50d4f1d5 8011343: Add new flag for verifying the heap during startup
johnc
parents: 8710
diff changeset
306 VM_Verify(bool silent) : _silent(silent) {}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
307 VMOp_Type type() const { return VMOp_Verify; }
a61af66fc99e Initial load
duke
parents:
diff changeset
308 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
309 };
a61af66fc99e Initial load
duke
parents:
diff changeset
310
a61af66fc99e Initial load
duke
parents:
diff changeset
311
a61af66fc99e Initial load
duke
parents:
diff changeset
312 class VM_PrintThreads: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
313 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
314 outputStream* _out;
a61af66fc99e Initial load
duke
parents:
diff changeset
315 bool _print_concurrent_locks;
a61af66fc99e Initial load
duke
parents:
diff changeset
316 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
317 VM_PrintThreads() { _out = tty; _print_concurrent_locks = PrintConcurrentLocks; }
a61af66fc99e Initial load
duke
parents:
diff changeset
318 VM_PrintThreads(outputStream* out, bool print_concurrent_locks) { _out = out; _print_concurrent_locks = print_concurrent_locks; }
a61af66fc99e Initial load
duke
parents:
diff changeset
319 VMOp_Type type() const { return VMOp_PrintThreads; }
a61af66fc99e Initial load
duke
parents:
diff changeset
320 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
321 bool doit_prologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
322 void doit_epilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
323 };
a61af66fc99e Initial load
duke
parents:
diff changeset
324
a61af66fc99e Initial load
duke
parents:
diff changeset
325 class VM_PrintJNI: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
326 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
327 outputStream* _out;
a61af66fc99e Initial load
duke
parents:
diff changeset
328 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
329 VM_PrintJNI() { _out = tty; }
a61af66fc99e Initial load
duke
parents:
diff changeset
330 VM_PrintJNI(outputStream* out) { _out = out; }
a61af66fc99e Initial load
duke
parents:
diff changeset
331 VMOp_Type type() const { return VMOp_PrintJNI; }
a61af66fc99e Initial load
duke
parents:
diff changeset
332 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
333 };
a61af66fc99e Initial load
duke
parents:
diff changeset
334
a61af66fc99e Initial load
duke
parents:
diff changeset
335 class DeadlockCycle;
a61af66fc99e Initial load
duke
parents:
diff changeset
336 class VM_FindDeadlocks: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
337 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
338 bool _concurrent_locks;
a61af66fc99e Initial load
duke
parents:
diff changeset
339 DeadlockCycle* _deadlocks;
a61af66fc99e Initial load
duke
parents:
diff changeset
340 outputStream* _out;
a61af66fc99e Initial load
duke
parents:
diff changeset
341
a61af66fc99e Initial load
duke
parents:
diff changeset
342 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
343 VM_FindDeadlocks(bool concurrent_locks) : _concurrent_locks(concurrent_locks), _out(NULL), _deadlocks(NULL) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
344 VM_FindDeadlocks(outputStream* st) : _concurrent_locks(true), _out(st), _deadlocks(NULL) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
345 ~VM_FindDeadlocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 DeadlockCycle* result() { return _deadlocks; };
a61af66fc99e Initial load
duke
parents:
diff changeset
348 VMOp_Type type() const { return VMOp_FindDeadlocks; }
a61af66fc99e Initial load
duke
parents:
diff changeset
349 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
350 bool doit_prologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
351 };
a61af66fc99e Initial load
duke
parents:
diff changeset
352
a61af66fc99e Initial load
duke
parents:
diff changeset
353 class ThreadDumpResult;
a61af66fc99e Initial load
duke
parents:
diff changeset
354 class ThreadSnapshot;
a61af66fc99e Initial load
duke
parents:
diff changeset
355 class ThreadConcurrentLocks;
a61af66fc99e Initial load
duke
parents:
diff changeset
356
a61af66fc99e Initial load
duke
parents:
diff changeset
357 class VM_ThreadDump : public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
358 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
359 ThreadDumpResult* _result;
a61af66fc99e Initial load
duke
parents:
diff changeset
360 int _num_threads;
a61af66fc99e Initial load
duke
parents:
diff changeset
361 GrowableArray<instanceHandle>* _threads;
a61af66fc99e Initial load
duke
parents:
diff changeset
362 int _max_depth;
a61af66fc99e Initial load
duke
parents:
diff changeset
363 bool _with_locked_monitors;
a61af66fc99e Initial load
duke
parents:
diff changeset
364 bool _with_locked_synchronizers;
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366 ThreadSnapshot* snapshot_thread(JavaThread* java_thread, ThreadConcurrentLocks* tcl);
a61af66fc99e Initial load
duke
parents:
diff changeset
367
a61af66fc99e Initial load
duke
parents:
diff changeset
368 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
369 VM_ThreadDump(ThreadDumpResult* result,
a61af66fc99e Initial load
duke
parents:
diff changeset
370 int max_depth, // -1 indicates entire stack
a61af66fc99e Initial load
duke
parents:
diff changeset
371 bool with_locked_monitors,
a61af66fc99e Initial load
duke
parents:
diff changeset
372 bool with_locked_synchronizers);
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374 VM_ThreadDump(ThreadDumpResult* result,
a61af66fc99e Initial load
duke
parents:
diff changeset
375 GrowableArray<instanceHandle>* threads,
a61af66fc99e Initial load
duke
parents:
diff changeset
376 int num_threads, // -1 indicates entire stack
a61af66fc99e Initial load
duke
parents:
diff changeset
377 int max_depth,
a61af66fc99e Initial load
duke
parents:
diff changeset
378 bool with_locked_monitors,
a61af66fc99e Initial load
duke
parents:
diff changeset
379 bool with_locked_synchronizers);
a61af66fc99e Initial load
duke
parents:
diff changeset
380
a61af66fc99e Initial load
duke
parents:
diff changeset
381 VMOp_Type type() const { return VMOp_ThreadDump; }
a61af66fc99e Initial load
duke
parents:
diff changeset
382 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
383 bool doit_prologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
384 void doit_epilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
385 };
a61af66fc99e Initial load
duke
parents:
diff changeset
386
a61af66fc99e Initial load
duke
parents:
diff changeset
387
a61af66fc99e Initial load
duke
parents:
diff changeset
388 class VM_Exit: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
389 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
390 int _exit_code;
a61af66fc99e Initial load
duke
parents:
diff changeset
391 static volatile bool _vm_exited;
a61af66fc99e Initial load
duke
parents:
diff changeset
392 static Thread * _shutdown_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
393 static void wait_if_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
394 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
395 VM_Exit(int exit_code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
396 _exit_code = exit_code;
a61af66fc99e Initial load
duke
parents:
diff changeset
397 }
a61af66fc99e Initial load
duke
parents:
diff changeset
398 static int wait_for_threads_in_native_to_block();
a61af66fc99e Initial load
duke
parents:
diff changeset
399 static int set_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
400 static bool vm_exited() { return _vm_exited; }
a61af66fc99e Initial load
duke
parents:
diff changeset
401 static void block_if_vm_exited() {
a61af66fc99e Initial load
duke
parents:
diff changeset
402 if (_vm_exited) {
a61af66fc99e Initial load
duke
parents:
diff changeset
403 wait_if_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
404 }
a61af66fc99e Initial load
duke
parents:
diff changeset
405 }
a61af66fc99e Initial load
duke
parents:
diff changeset
406 VMOp_Type type() const { return VMOp_Exit; }
a61af66fc99e Initial load
duke
parents:
diff changeset
407 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
408 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
409
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
410 #endif // SHARE_VM_RUNTIME_VM_OPERATIONS_HPP