annotate src/share/vm/runtime/interfaceSupport.cpp @ 1145:e018e6884bd8

6631166: CMS: better heuristics when combatting fragmentation Summary: Autonomic per-worker free block cache sizing, tunable coalition policies, fixes to per-size block statistics, retuned gain and bandwidth of some feedback loop filters to allow quicker reactivity to abrupt changes in ambient demand, and other heuristics to reduce fragmentation of the CMS old gen. Also tightened some assertions, including those related to locking. Reviewed-by: jmasa
author ysr
date Wed, 23 Dec 2009 09:23:54 -0800
parents bd02caa94611
children c18cbe5936b8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
844
bd02caa94611 6862919: Update copyright year
xdono
parents: 806
diff changeset
2 * Copyright 1997-2009 Sun Microsystems, Inc. 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 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 #include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 #include "incls/_interfaceSupport.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28
a61af66fc99e Initial load
duke
parents:
diff changeset
29 // Implementation of InterfaceSupport
a61af66fc99e Initial load
duke
parents:
diff changeset
30
a61af66fc99e Initial load
duke
parents:
diff changeset
31 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
32
a61af66fc99e Initial load
duke
parents:
diff changeset
33 long InterfaceSupport::_number_of_calls = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
34 long InterfaceSupport::_scavenge_alot_counter = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
35 long InterfaceSupport::_fullgc_alot_counter = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 long InterfaceSupport::_fullgc_alot_invocation = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
37
a61af66fc99e Initial load
duke
parents:
diff changeset
38 Histogram* RuntimeHistogram;
a61af66fc99e Initial load
duke
parents:
diff changeset
39
a61af66fc99e Initial load
duke
parents:
diff changeset
40 RuntimeHistogramElement::RuntimeHistogramElement(const char* elementName) {
a61af66fc99e Initial load
duke
parents:
diff changeset
41 static volatile jint RuntimeHistogram_lock = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 _name = elementName;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 uintx count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
44
a61af66fc99e Initial load
duke
parents:
diff changeset
45 while (Atomic::cmpxchg(1, &RuntimeHistogram_lock, 0) != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
46 while (OrderAccess::load_acquire(&RuntimeHistogram_lock) != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
47 count +=1;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 if ( (WarnOnStalledSpinLock > 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
49 && (count % WarnOnStalledSpinLock == 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
50 warning("RuntimeHistogram_lock seems to be stalled");
a61af66fc99e Initial load
duke
parents:
diff changeset
51 }
a61af66fc99e Initial load
duke
parents:
diff changeset
52 }
a61af66fc99e Initial load
duke
parents:
diff changeset
53 }
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 if (RuntimeHistogram == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
56 RuntimeHistogram = new Histogram("VM Runtime Call Counts",200);
a61af66fc99e Initial load
duke
parents:
diff changeset
57 }
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 RuntimeHistogram->add_element(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
60 Atomic::dec(&RuntimeHistogram_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
61 }
a61af66fc99e Initial load
duke
parents:
diff changeset
62
a61af66fc99e Initial load
duke
parents:
diff changeset
63 void InterfaceSupport::trace(const char* result_type, const char* header) {
a61af66fc99e Initial load
duke
parents:
diff changeset
64 tty->print_cr("%6d %s", _number_of_calls, header);
a61af66fc99e Initial load
duke
parents:
diff changeset
65 }
a61af66fc99e Initial load
duke
parents:
diff changeset
66
a61af66fc99e Initial load
duke
parents:
diff changeset
67 void InterfaceSupport::gc_alot() {
a61af66fc99e Initial load
duke
parents:
diff changeset
68 Thread *thread = Thread::current();
806
821269eca479 6820167: GCALotAtAllSafepoints + FullGCALot(ScavengeALot) options crash JVM
ysr
parents: 0
diff changeset
69 if (!thread->is_Java_thread()) return; // Avoid concurrent calls
0
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // Check for new, not quite initialized thread. A thread in new mode cannot initiate a GC.
a61af66fc99e Initial load
duke
parents:
diff changeset
71 JavaThread *current_thread = (JavaThread *)thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
72 if (current_thread->active_handles() == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
73
806
821269eca479 6820167: GCALotAtAllSafepoints + FullGCALot(ScavengeALot) options crash JVM
ysr
parents: 0
diff changeset
74 // Short-circuit any possible re-entrant gc-a-lot attempt
821269eca479 6820167: GCALotAtAllSafepoints + FullGCALot(ScavengeALot) options crash JVM
ysr
parents: 0
diff changeset
75 if (thread->skip_gcalot()) return;
821269eca479 6820167: GCALotAtAllSafepoints + FullGCALot(ScavengeALot) options crash JVM
ysr
parents: 0
diff changeset
76
0
a61af66fc99e Initial load
duke
parents:
diff changeset
77 if (is_init_completed()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 if (++_fullgc_alot_invocation < FullGCALotStart) {
a61af66fc99e Initial load
duke
parents:
diff changeset
80 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
81 }
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // Use this line if you want to block at a specific point,
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // e.g. one number_of_calls/scavenge/gc before you got into problems
a61af66fc99e Initial load
duke
parents:
diff changeset
85 if (FullGCALot) _fullgc_alot_counter--;
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // Check if we should force a full gc
a61af66fc99e Initial load
duke
parents:
diff changeset
88 if (_fullgc_alot_counter == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // Release dummy so objects are forced to move
a61af66fc99e Initial load
duke
parents:
diff changeset
90 if (!Universe::release_fullgc_alot_dummy()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
91 warning("FullGCALot: Unable to release more dummies at bottom of heap");
a61af66fc99e Initial load
duke
parents:
diff changeset
92 }
a61af66fc99e Initial load
duke
parents:
diff changeset
93 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
94 Universe::heap()->collect(GCCause::_full_gc_alot);
a61af66fc99e Initial load
duke
parents:
diff changeset
95 unsigned int invocations = Universe::heap()->total_full_collections();
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // Compute new interval
a61af66fc99e Initial load
duke
parents:
diff changeset
97 if (FullGCALotInterval > 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
98 _fullgc_alot_counter = 1+(long)((double)FullGCALotInterval*os::random()/(max_jint+1.0));
a61af66fc99e Initial load
duke
parents:
diff changeset
99 if (PrintGCDetails && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
100 tty->print_cr("Full gc no: %u\tInterval: %d", invocations,
a61af66fc99e Initial load
duke
parents:
diff changeset
101 _fullgc_alot_counter);
a61af66fc99e Initial load
duke
parents:
diff changeset
102 }
a61af66fc99e Initial load
duke
parents:
diff changeset
103 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
104 _fullgc_alot_counter = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
105 }
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // Print progress message
a61af66fc99e Initial load
duke
parents:
diff changeset
107 if (invocations % 100 == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
108 if (PrintGCDetails && Verbose) tty->print_cr("Full gc no: %u", invocations);
a61af66fc99e Initial load
duke
parents:
diff changeset
109 }
a61af66fc99e Initial load
duke
parents:
diff changeset
110 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
111 if (ScavengeALot) _scavenge_alot_counter--;
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // Check if we should force a scavenge
a61af66fc99e Initial load
duke
parents:
diff changeset
113 if (_scavenge_alot_counter == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
114 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
115 Universe::heap()->collect(GCCause::_scavenge_alot);
a61af66fc99e Initial load
duke
parents:
diff changeset
116 unsigned int invocations = Universe::heap()->total_collections() - Universe::heap()->total_full_collections();
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // Compute new interval
a61af66fc99e Initial load
duke
parents:
diff changeset
118 if (ScavengeALotInterval > 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
119 _scavenge_alot_counter = 1+(long)((double)ScavengeALotInterval*os::random()/(max_jint+1.0));
a61af66fc99e Initial load
duke
parents:
diff changeset
120 if (PrintGCDetails && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
121 tty->print_cr("Scavenge no: %u\tInterval: %d", invocations,
a61af66fc99e Initial load
duke
parents:
diff changeset
122 _scavenge_alot_counter);
a61af66fc99e Initial load
duke
parents:
diff changeset
123 }
a61af66fc99e Initial load
duke
parents:
diff changeset
124 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
125 _scavenge_alot_counter = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
126 }
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // Print progress message
a61af66fc99e Initial load
duke
parents:
diff changeset
128 if (invocations % 1000 == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
129 if (PrintGCDetails && Verbose) tty->print_cr("Scavenge no: %u", invocations);
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 }
a61af66fc99e Initial load
duke
parents:
diff changeset
134 }
a61af66fc99e Initial load
duke
parents:
diff changeset
135
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 vframe* vframe_array[50];
a61af66fc99e Initial load
duke
parents:
diff changeset
138 int walk_stack_counter = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140 void InterfaceSupport::walk_stack_from(vframe* start_vf) {
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // walk
a61af66fc99e Initial load
duke
parents:
diff changeset
142 int i = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
143 for (vframe* f = start_vf; f; f = f->sender() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
144 if (i < 50) vframe_array[i++] = f;
a61af66fc99e Initial load
duke
parents:
diff changeset
145 }
a61af66fc99e Initial load
duke
parents:
diff changeset
146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 void InterfaceSupport::walk_stack() {
a61af66fc99e Initial load
duke
parents:
diff changeset
150 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
151 walk_stack_counter++;
a61af66fc99e Initial load
duke
parents:
diff changeset
152 if (!thread->has_last_Java_frame()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
153 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
154 RegisterMap reg_map(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
155 walk_stack_from(thread->last_java_vframe(&reg_map));
a61af66fc99e Initial load
duke
parents:
diff changeset
156 }
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158
a61af66fc99e Initial load
duke
parents:
diff changeset
159 # ifdef ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
160
a61af66fc99e Initial load
duke
parents:
diff changeset
161 static int zap_traversals = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
162
a61af66fc99e Initial load
duke
parents:
diff changeset
163 void InterfaceSupport::zap_dead_locals_old() {
a61af66fc99e Initial load
duke
parents:
diff changeset
164 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
165 if (zap_traversals == -1) // edit constant for debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
166 warning("I am here");
a61af66fc99e Initial load
duke
parents:
diff changeset
167 int zap_frame_count = 0; // count frames to help debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
168 for (StackFrameStream sfs(thread); !sfs.is_done(); sfs.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
169 sfs.current()->zap_dead_locals(thread, sfs.register_map());
a61af66fc99e Initial load
duke
parents:
diff changeset
170 ++zap_frame_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
172 ++zap_traversals;
a61af66fc99e Initial load
duke
parents:
diff changeset
173 }
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175 # endif
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 int deoptimizeAllCounter = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
179 int zombieAllCounter = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 void InterfaceSupport::zombieAll() {
a61af66fc99e Initial load
duke
parents:
diff changeset
183 if (is_init_completed() && zombieAllCounter > ZombieALotInterval) {
a61af66fc99e Initial load
duke
parents:
diff changeset
184 zombieAllCounter = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
185 VM_ZombieAll op;
a61af66fc99e Initial load
duke
parents:
diff changeset
186 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
187 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
188 zombieAllCounter++;
a61af66fc99e Initial load
duke
parents:
diff changeset
189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
190 }
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 void InterfaceSupport::deoptimizeAll() {
a61af66fc99e Initial load
duke
parents:
diff changeset
193 if (is_init_completed() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
194 if (DeoptimizeALot && deoptimizeAllCounter > DeoptimizeALotInterval) {
a61af66fc99e Initial load
duke
parents:
diff changeset
195 deoptimizeAllCounter = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
196 VM_DeoptimizeAll op;
a61af66fc99e Initial load
duke
parents:
diff changeset
197 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
198 } else if (DeoptimizeRandom && (deoptimizeAllCounter & 0x1f) == (os::random() & 0x1f)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
199 VM_DeoptimizeAll op;
a61af66fc99e Initial load
duke
parents:
diff changeset
200 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
201 }
a61af66fc99e Initial load
duke
parents:
diff changeset
202 }
a61af66fc99e Initial load
duke
parents:
diff changeset
203 deoptimizeAllCounter++;
a61af66fc99e Initial load
duke
parents:
diff changeset
204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207 void InterfaceSupport::stress_derived_pointers() {
a61af66fc99e Initial load
duke
parents:
diff changeset
208 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
209 JavaThread *thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
210 if (!is_init_completed()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
211 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
212 bool found = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
213 for (StackFrameStream sfs(thread); !sfs.is_done() && !found; sfs.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
214 CodeBlob* cb = sfs.current()->cb();
a61af66fc99e Initial load
duke
parents:
diff changeset
215 if (cb != NULL && cb->oop_maps() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // Find oopmap for current method
a61af66fc99e Initial load
duke
parents:
diff changeset
217 OopMap* map = cb->oop_map_for_return_address(sfs.current()->pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
218 assert(map != NULL, "no oopmap found for pc");
a61af66fc99e Initial load
duke
parents:
diff changeset
219 found = map->has_derived_pointer();
a61af66fc99e Initial load
duke
parents:
diff changeset
220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
221 }
a61af66fc99e Initial load
duke
parents:
diff changeset
222 if (found) {
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // $$$ Not sure what to do here.
a61af66fc99e Initial load
duke
parents:
diff changeset
224 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
225 Scavenge::invoke(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
226 */
a61af66fc99e Initial load
duke
parents:
diff changeset
227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
228 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
230
a61af66fc99e Initial load
duke
parents:
diff changeset
231
a61af66fc99e Initial load
duke
parents:
diff changeset
232 void InterfaceSupport::verify_stack() {
a61af66fc99e Initial load
duke
parents:
diff changeset
233 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
234 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // disabled because it throws warnings that oop maps should only be accessed
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // in VM thread or during debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238 if (!thread->has_pending_exception()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // verification does not work if there are pending exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
240 StackFrameStream sfs(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
241 CodeBlob* cb = sfs.current()->cb();
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // In case of exceptions we might not have a runtime_stub on
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // top of stack, hence, all callee-saved registers are not going
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // to be setup correctly, hence, we cannot do stack verify
a61af66fc99e Initial load
duke
parents:
diff changeset
245 if (cb != NULL && !(cb->is_runtime_stub() || cb->is_uncommon_trap_stub())) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
246
a61af66fc99e Initial load
duke
parents:
diff changeset
247 for (; !sfs.is_done(); sfs.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
248 sfs.current()->verify(sfs.register_map());
a61af66fc99e Initial load
duke
parents:
diff changeset
249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
250 }
a61af66fc99e Initial load
duke
parents:
diff changeset
251 }
a61af66fc99e Initial load
duke
parents:
diff changeset
252
a61af66fc99e Initial load
duke
parents:
diff changeset
253
a61af66fc99e Initial load
duke
parents:
diff changeset
254 void InterfaceSupport::verify_last_frame() {
a61af66fc99e Initial load
duke
parents:
diff changeset
255 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
256 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
257 RegisterMap reg_map(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
258 frame fr = thread->last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
259 fr.verify(&reg_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
260 }
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
264
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 void InterfaceSupport_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
267 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
268 if (ScavengeALot || FullGCALot) {
a61af66fc99e Initial load
duke
parents:
diff changeset
269 srand(ScavengeALotInterval * FullGCALotInterval);
a61af66fc99e Initial load
duke
parents:
diff changeset
270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
271 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
272 }