annotate src/share/vm/runtime/safepoint.cpp @ 1721:413ad0331a0c

6977924: Changes for 6975078 produce build error with certain gcc versions Summary: The changes introduced for 6975078 assign badHeapOopVal to the _allocation field in the ResourceObj class. In 32 bit linux builds with certain versions of gcc this assignment will be flagged as an error while compiling allocation.cpp. In 32 bit builds the constant value badHeapOopVal (which is cast to an intptr_t) is negative. The _allocation field is typed as an unsigned intptr_t and gcc catches this as an error. Reviewed-by: jcoomes, ysr, phh
author johnc
date Wed, 18 Aug 2010 10:59:06 -0700
parents c18cbe5936b8
children da877bdc9000
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1538
diff changeset
2 * Copyright (c) 1997, 2009, 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: 1538
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1538
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: 1538
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
a61af66fc99e Initial load
duke
parents:
diff changeset
25 # include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 # include "incls/_safepoint.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 Safepoint begin/end
a61af66fc99e Initial load
duke
parents:
diff changeset
30
a61af66fc99e Initial load
duke
parents:
diff changeset
31 SafepointSynchronize::SynchronizeState volatile SafepointSynchronize::_state = SafepointSynchronize::_not_synchronized;
a61af66fc99e Initial load
duke
parents:
diff changeset
32 volatile int SafepointSynchronize::_waiting_to_block = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
33 volatile int SafepointSynchronize::_safepoint_counter = 0;
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
34 long SafepointSynchronize::_end_of_last_safepoint = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
35 static volatile int PageArmed = 0 ; // safepoint polling page is RO|RW vs PROT_NONE
a61af66fc99e Initial load
duke
parents:
diff changeset
36 static volatile int TryingToBlock = 0 ; // proximate value -- for advisory use only
a61af66fc99e Initial load
duke
parents:
diff changeset
37 static bool timeout_error_printed = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
38
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // Roll all threads forward to a safepoint and suspend them all
a61af66fc99e Initial load
duke
parents:
diff changeset
40 void SafepointSynchronize::begin() {
a61af66fc99e Initial load
duke
parents:
diff changeset
41
a61af66fc99e Initial load
duke
parents:
diff changeset
42 Thread* myThread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
43 assert(myThread->is_VM_thread(), "Only VM thread may execute a safepoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
44
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
45 if (PrintSafepointStatistics || PrintSafepointStatisticsTimeout > 0) {
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
46 _safepoint_begin_time = os::javaTimeNanos();
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
47 _ts_of_current_safepoint = tty->time_stamp().seconds();
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
48 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
49
a61af66fc99e Initial load
duke
parents:
diff changeset
50 #ifndef SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
51 if (UseConcMarkSweepGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // In the future we should investigate whether CMS can use the
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // more-general mechanism below. DLD (01/05).
a61af66fc99e Initial load
duke
parents:
diff changeset
54 ConcurrentMarkSweepThread::synchronize(false);
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 628
diff changeset
55 } else if (UseG1GC) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
56 ConcurrentGCThread::safepoint_synchronize();
a61af66fc99e Initial load
duke
parents:
diff changeset
57 }
a61af66fc99e Initial load
duke
parents:
diff changeset
58 #endif // SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // By getting the Threads_lock, we assure that no threads are about to start or
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // exit. It is released again in SafepointSynchronize::end().
a61af66fc99e Initial load
duke
parents:
diff changeset
62 Threads_lock->lock();
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 assert( _state == _not_synchronized, "trying to safepoint synchronize with wrong state");
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 int nof_threads = Threads::number_of_threads();
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 if (TraceSafepoint) {
a61af66fc99e Initial load
duke
parents:
diff changeset
69 tty->print_cr("Safepoint synchronization initiated. (%d)", nof_threads);
a61af66fc99e Initial load
duke
parents:
diff changeset
70 }
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 RuntimeService::record_safepoint_begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 {
a61af66fc99e Initial load
duke
parents:
diff changeset
75 MutexLocker mu(Safepoint_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // Set number of threads to wait for, before we initiate the callbacks
a61af66fc99e Initial load
duke
parents:
diff changeset
78 _waiting_to_block = nof_threads;
a61af66fc99e Initial load
duke
parents:
diff changeset
79 TryingToBlock = 0 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
80 int still_running = nof_threads;
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // Save the starting time, so that it can be compared to see if this has taken
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // too long to complete.
a61af66fc99e Initial load
duke
parents:
diff changeset
84 jlong safepoint_limit_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
85 timeout_error_printed = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
86
1003
528d98fe1037 6880029: JDK 1.6.0_u14p Application crashed very early
xlu
parents: 979
diff changeset
87 // PrintSafepointStatisticsTimeout can be specified separately. When
528d98fe1037 6880029: JDK 1.6.0_u14p Application crashed very early
xlu
parents: 979
diff changeset
88 // specified, PrintSafepointStatistics will be set to true in
528d98fe1037 6880029: JDK 1.6.0_u14p Application crashed very early
xlu
parents: 979
diff changeset
89 // deferred_initialize_stat method. The initialization has to be done
528d98fe1037 6880029: JDK 1.6.0_u14p Application crashed very early
xlu
parents: 979
diff changeset
90 // early enough to avoid any races. See bug 6880029 for details.
528d98fe1037 6880029: JDK 1.6.0_u14p Application crashed very early
xlu
parents: 979
diff changeset
91 if (PrintSafepointStatistics || PrintSafepointStatisticsTimeout > 0) {
528d98fe1037 6880029: JDK 1.6.0_u14p Application crashed very early
xlu
parents: 979
diff changeset
92 deferred_initialize_stat();
528d98fe1037 6880029: JDK 1.6.0_u14p Application crashed very early
xlu
parents: 979
diff changeset
93 }
528d98fe1037 6880029: JDK 1.6.0_u14p Application crashed very early
xlu
parents: 979
diff changeset
94
0
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // Begin the process of bringing the system to a safepoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // Java threads can be in several different states and are
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // stopped by different mechanisms:
a61af66fc99e Initial load
duke
parents:
diff changeset
98 //
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // 1. Running interpreted
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // The interpeter dispatch table is changed to force it to
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // check for a safepoint condition between bytecodes.
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // 2. Running in native code
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // When returning from the native code, a Java thread must check
a61af66fc99e Initial load
duke
parents:
diff changeset
104 // the safepoint _state to see if we must block. If the
a61af66fc99e Initial load
duke
parents:
diff changeset
105 // VM thread sees a Java thread in native, it does
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // not wait for this thread to block. The order of the memory
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // writes and reads of both the safepoint state and the Java
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // threads state is critical. In order to guarantee that the
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // memory writes are serialized with respect to each other,
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // the VM thread issues a memory barrier instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // (on MP systems). In order to avoid the overhead of issuing
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // a memory barrier for each Java thread making native calls, each Java
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // thread performs a write to a single memory page after changing
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // the thread state. The VM thread performs a sequence of
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // mprotect OS calls which forces all previous writes from all
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // Java threads to be serialized. This is done in the
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // os::serialize_thread_states() call. This has proven to be
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // much more efficient than executing a membar instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // on every call to native code.
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // 3. Running compiled Code
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // Compiled code reads a global (Safepoint Polling) page that
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // is set to fault if we are trying to get to a safepoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // 4. Blocked
a61af66fc99e Initial load
duke
parents:
diff changeset
124 // A thread which is blocked will not be allowed to return from the
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // block condition until the safepoint operation is complete.
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // 5. In VM or Transitioning between states
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // If a Java thread is currently running in the VM or transitioning
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // between states, the safepointing code will wait for the thread to
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // block itself when it attempts transitions to a new state.
a61af66fc99e Initial load
duke
parents:
diff changeset
130 //
a61af66fc99e Initial load
duke
parents:
diff changeset
131 _state = _synchronizing;
a61af66fc99e Initial load
duke
parents:
diff changeset
132 OrderAccess::fence();
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 // Flush all thread states to memory
a61af66fc99e Initial load
duke
parents:
diff changeset
135 if (!UseMembar) {
a61af66fc99e Initial load
duke
parents:
diff changeset
136 os::serialize_thread_states();
a61af66fc99e Initial load
duke
parents:
diff changeset
137 }
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // Make interpreter safepoint aware
a61af66fc99e Initial load
duke
parents:
diff changeset
140 Interpreter::notice_safepoints();
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 if (UseCompilerSafepoints && DeferPollingPageLoopCount < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // Make polling safepoint aware
a61af66fc99e Initial load
duke
parents:
diff changeset
144 guarantee (PageArmed == 0, "invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
145 PageArmed = 1 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
146 os::make_polling_page_unreadable();
a61af66fc99e Initial load
duke
parents:
diff changeset
147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // Consider using active_processor_count() ... but that call is expensive.
a61af66fc99e Initial load
duke
parents:
diff changeset
150 int ncpus = os::processor_count() ;
a61af66fc99e Initial load
duke
parents:
diff changeset
151
a61af66fc99e Initial load
duke
parents:
diff changeset
152 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
153 for (JavaThread *cur = Threads::first(); cur != NULL; cur = cur->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
154 assert(cur->safepoint_state()->is_running(), "Illegal initial state");
a61af66fc99e Initial load
duke
parents:
diff changeset
155 }
a61af66fc99e Initial load
duke
parents:
diff changeset
156 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 if (SafepointTimeout)
a61af66fc99e Initial load
duke
parents:
diff changeset
159 safepoint_limit_time = os::javaTimeNanos() + (jlong)SafepointTimeoutDelay * MICROUNITS;
a61af66fc99e Initial load
duke
parents:
diff changeset
160
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // Iterate through all threads until it have been determined how to stop them all at a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
162 unsigned int iterations = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
163 int steps = 0 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
164 while(still_running > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
165 for (JavaThread *cur = Threads::first(); cur != NULL; cur = cur->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
166 assert(!cur->is_ConcurrentGC_thread(), "A concurrent GC thread is unexpectly being suspended");
a61af66fc99e Initial load
duke
parents:
diff changeset
167 ThreadSafepointState *cur_state = cur->safepoint_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
168 if (cur_state->is_running()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
169 cur_state->examine_state_of_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
170 if (!cur_state->is_running()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
171 still_running--;
a61af66fc99e Initial load
duke
parents:
diff changeset
172 // consider adjusting steps downward:
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // steps = 0
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // steps -= NNN
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // steps >>= 1
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // steps = MIN(steps, 2000-100)
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // if (iterations != 0) steps -= NNN
a61af66fc99e Initial load
duke
parents:
diff changeset
178 }
a61af66fc99e Initial load
duke
parents:
diff changeset
179 if (TraceSafepoint && Verbose) cur_state->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
182
1003
528d98fe1037 6880029: JDK 1.6.0_u14p Application crashed very early
xlu
parents: 979
diff changeset
183 if (PrintSafepointStatistics && iterations == 0) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
184 begin_statistics(nof_threads, still_running);
a61af66fc99e Initial load
duke
parents:
diff changeset
185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 if (still_running > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // Check for if it takes to long
a61af66fc99e Initial load
duke
parents:
diff changeset
189 if (SafepointTimeout && safepoint_limit_time < os::javaTimeNanos()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
190 print_safepoint_timeout(_spinning_timeout);
a61af66fc99e Initial load
duke
parents:
diff changeset
191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // Spin to avoid context switching.
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // There's a tension between allowing the mutators to run (and rendezvous)
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // vs spinning. As the VM thread spins, wasting cycles, it consumes CPU that
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // a mutator might otherwise use profitably to reach a safepoint. Excessive
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // spinning by the VM thread on a saturated system can increase rendezvous latency.
a61af66fc99e Initial load
duke
parents:
diff changeset
198 // Blocking or yielding incur their own penalties in the form of context switching
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // and the resultant loss of $ residency.
a61af66fc99e Initial load
duke
parents:
diff changeset
200 //
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // Further complicating matters is that yield() does not work as naively expected
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // on many platforms -- yield() does not guarantee that any other ready threads
a61af66fc99e Initial load
duke
parents:
diff changeset
203 // will run. As such we revert yield_all() after some number of iterations.
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // Yield_all() is implemented as a short unconditional sleep on some platforms.
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // Typical operating systems round a "short" sleep period up to 10 msecs, so sleeping
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // can actually increase the time it takes the VM thread to detect that a system-wide
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // stop-the-world safepoint has been reached. In a pathological scenario such as that
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // described in CR6415670 the VMthread may sleep just before the mutator(s) become safe.
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // In that case the mutators will be stalled waiting for the safepoint to complete and the
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // the VMthread will be sleeping, waiting for the mutators to rendezvous. The VMthread
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // will eventually wake up and detect that all mutators are safe, at which point
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // we'll again make progress.
a61af66fc99e Initial load
duke
parents:
diff changeset
213 //
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // Beware too that that the VMThread typically runs at elevated priority.
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // Its default priority is higher than the default mutator priority.
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // Obviously, this complicates spinning.
a61af66fc99e Initial load
duke
parents:
diff changeset
217 //
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // Note too that on Windows XP SwitchThreadTo() has quite different behavior than Sleep(0).
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // Sleep(0) will _not yield to lower priority threads, while SwitchThreadTo() will.
a61af66fc99e Initial load
duke
parents:
diff changeset
220 //
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // See the comments in synchronizer.cpp for additional remarks on spinning.
a61af66fc99e Initial load
duke
parents:
diff changeset
222 //
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // In the future we might:
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // 1. Modify the safepoint scheme to avoid potentally unbounded spinning.
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // This is tricky as the path used by a thread exiting the JVM (say on
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // on JNI call-out) simply stores into its state field. The burden
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // is placed on the VM thread, which must poll (spin).
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // 2. Find something useful to do while spinning. If the safepoint is GC-related
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // we might aggressively scan the stacks of threads that are already safe.
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // 3. Use Solaris schedctl to examine the state of the still-running mutators.
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // If all the mutators are ONPROC there's no reason to sleep or yield.
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // 4. YieldTo() any still-running mutators that are ready but OFFPROC.
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // 5. Check system saturation. If the system is not fully saturated then
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // simply spin and avoid sleep/yield.
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // 6. As still-running mutators rendezvous they could unpark the sleeping
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // VMthread. This works well for still-running mutators that become
a61af66fc99e Initial load
duke
parents:
diff changeset
237 // safe. The VMthread must still poll for mutators that call-out.
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // 7. Drive the policy on time-since-begin instead of iterations.
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // 8. Consider making the spin duration a function of the # of CPUs:
a61af66fc99e Initial load
duke
parents:
diff changeset
240 // Spin = (((ncpus-1) * M) + K) + F(still_running)
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // Alternately, instead of counting iterations of the outer loop
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // we could count the # of threads visited in the inner loop, above.
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // 9. On windows consider using the return value from SwitchThreadTo()
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // to drive subsequent spin/SwitchThreadTo()/Sleep(N) decisions.
a61af66fc99e Initial load
duke
parents:
diff changeset
245
a61af66fc99e Initial load
duke
parents:
diff changeset
246 if (UseCompilerSafepoints && int(iterations) == DeferPollingPageLoopCount) {
a61af66fc99e Initial load
duke
parents:
diff changeset
247 guarantee (PageArmed == 0, "invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
248 PageArmed = 1 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
249 os::make_polling_page_unreadable();
a61af66fc99e Initial load
duke
parents:
diff changeset
250 }
a61af66fc99e Initial load
duke
parents:
diff changeset
251
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // Instead of (ncpus > 1) consider either (still_running < (ncpus + EPSILON)) or
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // ((still_running + _waiting_to_block - TryingToBlock)) < ncpus)
a61af66fc99e Initial load
duke
parents:
diff changeset
254 ++steps ;
a61af66fc99e Initial load
duke
parents:
diff changeset
255 if (ncpus > 1 && steps < SafepointSpinBeforeYield) {
a61af66fc99e Initial load
duke
parents:
diff changeset
256 SpinPause() ; // MP-Polite spin
a61af66fc99e Initial load
duke
parents:
diff changeset
257 } else
a61af66fc99e Initial load
duke
parents:
diff changeset
258 if (steps < DeferThrSuspendLoopCount) {
a61af66fc99e Initial load
duke
parents:
diff changeset
259 os::NakedYield() ;
a61af66fc99e Initial load
duke
parents:
diff changeset
260 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
261 os::yield_all(steps) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
262 // Alternately, the VM thread could transiently depress its scheduling priority or
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // transiently increase the priority of the tardy mutator(s).
a61af66fc99e Initial load
duke
parents:
diff changeset
264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 iterations ++ ;
a61af66fc99e Initial load
duke
parents:
diff changeset
267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
268 assert(iterations < (uint)max_jint, "We have been iterating in the safepoint loop too long");
a61af66fc99e Initial load
duke
parents:
diff changeset
269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
270 assert(still_running == 0, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272 if (PrintSafepointStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
273 update_statistics_on_spin_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
274 }
a61af66fc99e Initial load
duke
parents:
diff changeset
275
a61af66fc99e Initial load
duke
parents:
diff changeset
276 // wait until all threads are stopped
a61af66fc99e Initial load
duke
parents:
diff changeset
277 while (_waiting_to_block > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
278 if (TraceSafepoint) tty->print_cr("Waiting for %d thread(s) to block", _waiting_to_block);
a61af66fc99e Initial load
duke
parents:
diff changeset
279 if (!SafepointTimeout || timeout_error_printed) {
a61af66fc99e Initial load
duke
parents:
diff changeset
280 Safepoint_lock->wait(true); // true, means with no safepoint checks
a61af66fc99e Initial load
duke
parents:
diff changeset
281 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
282 // Compute remaining time
a61af66fc99e Initial load
duke
parents:
diff changeset
283 jlong remaining_time = safepoint_limit_time - os::javaTimeNanos();
a61af66fc99e Initial load
duke
parents:
diff changeset
284
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // If there is no remaining time, then there is an error
a61af66fc99e Initial load
duke
parents:
diff changeset
286 if (remaining_time < 0 || Safepoint_lock->wait(true, remaining_time / MICROUNITS)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
287 print_safepoint_timeout(_blocking_timeout);
a61af66fc99e Initial load
duke
parents:
diff changeset
288 }
a61af66fc99e Initial load
duke
parents:
diff changeset
289 }
a61af66fc99e Initial load
duke
parents:
diff changeset
290 }
a61af66fc99e Initial load
duke
parents:
diff changeset
291 assert(_waiting_to_block == 0, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
294 if (SafepointTimeout) {
a61af66fc99e Initial load
duke
parents:
diff changeset
295 jlong current_time = os::javaTimeNanos();
a61af66fc99e Initial load
duke
parents:
diff changeset
296 if (safepoint_limit_time < current_time) {
a61af66fc99e Initial load
duke
parents:
diff changeset
297 tty->print_cr("# SafepointSynchronize: Finished after "
a61af66fc99e Initial load
duke
parents:
diff changeset
298 INT64_FORMAT_W(6) " ms",
a61af66fc99e Initial load
duke
parents:
diff changeset
299 ((current_time - safepoint_limit_time) / MICROUNITS +
a61af66fc99e Initial load
duke
parents:
diff changeset
300 SafepointTimeoutDelay));
a61af66fc99e Initial load
duke
parents:
diff changeset
301 }
a61af66fc99e Initial load
duke
parents:
diff changeset
302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
303 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
304
a61af66fc99e Initial load
duke
parents:
diff changeset
305 assert((_safepoint_counter & 0x1) == 0, "must be even");
a61af66fc99e Initial load
duke
parents:
diff changeset
306 assert(Threads_lock->owned_by_self(), "must hold Threads_lock");
a61af66fc99e Initial load
duke
parents:
diff changeset
307 _safepoint_counter ++;
a61af66fc99e Initial load
duke
parents:
diff changeset
308
a61af66fc99e Initial load
duke
parents:
diff changeset
309 // Record state
a61af66fc99e Initial load
duke
parents:
diff changeset
310 _state = _synchronized;
a61af66fc99e Initial load
duke
parents:
diff changeset
311
a61af66fc99e Initial load
duke
parents:
diff changeset
312 OrderAccess::fence();
a61af66fc99e Initial load
duke
parents:
diff changeset
313
a61af66fc99e Initial load
duke
parents:
diff changeset
314 if (TraceSafepoint) {
a61af66fc99e Initial load
duke
parents:
diff changeset
315 VM_Operation *op = VMThread::vm_operation();
a61af66fc99e Initial load
duke
parents:
diff changeset
316 tty->print_cr("Entering safepoint region: %s", (op != NULL) ? op->name() : "no vm operation");
a61af66fc99e Initial load
duke
parents:
diff changeset
317 }
a61af66fc99e Initial load
duke
parents:
diff changeset
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319 RuntimeService::record_safepoint_synchronized();
a61af66fc99e Initial load
duke
parents:
diff changeset
320 if (PrintSafepointStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
321 update_statistics_on_sync_end(os::javaTimeNanos());
a61af66fc99e Initial load
duke
parents:
diff changeset
322 }
a61af66fc99e Initial load
duke
parents:
diff changeset
323
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // Call stuff that needs to be run when a safepoint is just about to be completed
a61af66fc99e Initial load
duke
parents:
diff changeset
325 do_cleanup_tasks();
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
326
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
327 if (PrintSafepointStatistics) {
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
328 // Record how much time spend on the above cleanup tasks
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
329 update_statistics_on_cleanup_end(os::javaTimeNanos());
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
330 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
331 }
a61af66fc99e Initial load
duke
parents:
diff changeset
332 }
a61af66fc99e Initial load
duke
parents:
diff changeset
333
a61af66fc99e Initial load
duke
parents:
diff changeset
334 // Wake up all threads, so they are ready to resume execution after the safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
335 // operation has been carried out
a61af66fc99e Initial load
duke
parents:
diff changeset
336 void SafepointSynchronize::end() {
a61af66fc99e Initial load
duke
parents:
diff changeset
337
a61af66fc99e Initial load
duke
parents:
diff changeset
338 assert(Threads_lock->owned_by_self(), "must hold Threads_lock");
a61af66fc99e Initial load
duke
parents:
diff changeset
339 assert((_safepoint_counter & 0x1) == 1, "must be odd");
a61af66fc99e Initial load
duke
parents:
diff changeset
340 _safepoint_counter ++;
a61af66fc99e Initial load
duke
parents:
diff changeset
341 // memory fence isn't required here since an odd _safepoint_counter
a61af66fc99e Initial load
duke
parents:
diff changeset
342 // value can do no harm and a fence is issued below anyway.
a61af66fc99e Initial load
duke
parents:
diff changeset
343
a61af66fc99e Initial load
duke
parents:
diff changeset
344 DEBUG_ONLY(Thread* myThread = Thread::current();)
a61af66fc99e Initial load
duke
parents:
diff changeset
345 assert(myThread->is_VM_thread(), "Only VM thread can execute a safepoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 if (PrintSafepointStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
348 end_statistics(os::javaTimeNanos());
a61af66fc99e Initial load
duke
parents:
diff changeset
349 }
a61af66fc99e Initial load
duke
parents:
diff changeset
350
a61af66fc99e Initial load
duke
parents:
diff changeset
351 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
352 // A pending_exception cannot be installed during a safepoint. The threads
a61af66fc99e Initial load
duke
parents:
diff changeset
353 // may install an async exception after they come back from a safepoint into
a61af66fc99e Initial load
duke
parents:
diff changeset
354 // pending_exception after they unblock. But that should happen later.
a61af66fc99e Initial load
duke
parents:
diff changeset
355 for(JavaThread *cur = Threads::first(); cur; cur = cur->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
356 assert (!(cur->has_pending_exception() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
357 cur->safepoint_state()->is_at_poll_safepoint()),
a61af66fc99e Initial load
duke
parents:
diff changeset
358 "safepoint installed a pending exception");
a61af66fc99e Initial load
duke
parents:
diff changeset
359 }
a61af66fc99e Initial load
duke
parents:
diff changeset
360 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
361
a61af66fc99e Initial load
duke
parents:
diff changeset
362 if (PageArmed) {
a61af66fc99e Initial load
duke
parents:
diff changeset
363 // Make polling safepoint aware
a61af66fc99e Initial load
duke
parents:
diff changeset
364 os::make_polling_page_readable();
a61af66fc99e Initial load
duke
parents:
diff changeset
365 PageArmed = 0 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
366 }
a61af66fc99e Initial load
duke
parents:
diff changeset
367
a61af66fc99e Initial load
duke
parents:
diff changeset
368 // Remove safepoint check from interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
369 Interpreter::ignore_safepoints();
a61af66fc99e Initial load
duke
parents:
diff changeset
370
a61af66fc99e Initial load
duke
parents:
diff changeset
371 {
a61af66fc99e Initial load
duke
parents:
diff changeset
372 MutexLocker mu(Safepoint_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374 assert(_state == _synchronized, "must be synchronized before ending safepoint synchronization");
a61af66fc99e Initial load
duke
parents:
diff changeset
375
a61af66fc99e Initial load
duke
parents:
diff changeset
376 // Set to not synchronized, so the threads will not go into the signal_thread_blocked method
a61af66fc99e Initial load
duke
parents:
diff changeset
377 // when they get restarted.
a61af66fc99e Initial load
duke
parents:
diff changeset
378 _state = _not_synchronized;
a61af66fc99e Initial load
duke
parents:
diff changeset
379 OrderAccess::fence();
a61af66fc99e Initial load
duke
parents:
diff changeset
380
a61af66fc99e Initial load
duke
parents:
diff changeset
381 if (TraceSafepoint) {
a61af66fc99e Initial load
duke
parents:
diff changeset
382 tty->print_cr("Leaving safepoint region");
a61af66fc99e Initial load
duke
parents:
diff changeset
383 }
a61af66fc99e Initial load
duke
parents:
diff changeset
384
a61af66fc99e Initial load
duke
parents:
diff changeset
385 // Start suspended threads
a61af66fc99e Initial load
duke
parents:
diff changeset
386 for(JavaThread *current = Threads::first(); current; current = current->next()) {
605
98cb887364d3 6810672: Comment typos
twisti
parents: 513
diff changeset
387 // A problem occurring on Solaris is when attempting to restart threads
0
a61af66fc99e Initial load
duke
parents:
diff changeset
388 // the first #cpus - 1 go well, but then the VMThread is preempted when we get
a61af66fc99e Initial load
duke
parents:
diff changeset
389 // to the next one (since it has been running the longest). We then have
a61af66fc99e Initial load
duke
parents:
diff changeset
390 // to wait for a cpu to become available before we can continue restarting
a61af66fc99e Initial load
duke
parents:
diff changeset
391 // threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // FIXME: This causes the performance of the VM to degrade when active and with
a61af66fc99e Initial load
duke
parents:
diff changeset
393 // large numbers of threads. Apparently this is due to the synchronous nature
a61af66fc99e Initial load
duke
parents:
diff changeset
394 // of suspending threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
395 //
a61af66fc99e Initial load
duke
parents:
diff changeset
396 // TODO-FIXME: the comments above are vestigial and no longer apply.
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // Furthermore, using solaris' schedctl in this particular context confers no benefit
a61af66fc99e Initial load
duke
parents:
diff changeset
398 if (VMThreadHintNoPreempt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
399 os::hint_no_preempt();
a61af66fc99e Initial load
duke
parents:
diff changeset
400 }
a61af66fc99e Initial load
duke
parents:
diff changeset
401 ThreadSafepointState* cur_state = current->safepoint_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
402 assert(cur_state->type() != ThreadSafepointState::_running, "Thread not suspended at safepoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
403 cur_state->restart();
a61af66fc99e Initial load
duke
parents:
diff changeset
404 assert(cur_state->is_running(), "safepoint state has not been reset");
a61af66fc99e Initial load
duke
parents:
diff changeset
405 }
a61af66fc99e Initial load
duke
parents:
diff changeset
406
a61af66fc99e Initial load
duke
parents:
diff changeset
407 RuntimeService::record_safepoint_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
408
a61af66fc99e Initial load
duke
parents:
diff changeset
409 // Release threads lock, so threads can be created/destroyed again. It will also starts all threads
a61af66fc99e Initial load
duke
parents:
diff changeset
410 // blocked in signal_thread_blocked
a61af66fc99e Initial load
duke
parents:
diff changeset
411 Threads_lock->unlock();
a61af66fc99e Initial load
duke
parents:
diff changeset
412
a61af66fc99e Initial load
duke
parents:
diff changeset
413 }
a61af66fc99e Initial load
duke
parents:
diff changeset
414 #ifndef SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // If there are any concurrent GC threads resume them.
a61af66fc99e Initial load
duke
parents:
diff changeset
416 if (UseConcMarkSweepGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
417 ConcurrentMarkSweepThread::desynchronize(false);
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 628
diff changeset
418 } else if (UseG1GC) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
419 ConcurrentGCThread::safepoint_desynchronize();
a61af66fc99e Initial load
duke
parents:
diff changeset
420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
421 #endif // SERIALGC
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
422 // record this time so VMThread can keep track how much time has elasped
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
423 // since last safepoint.
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
424 _end_of_last_safepoint = os::javaTimeMillis();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
425 }
a61af66fc99e Initial load
duke
parents:
diff changeset
426
a61af66fc99e Initial load
duke
parents:
diff changeset
427 bool SafepointSynchronize::is_cleanup_needed() {
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // Need a safepoint if some inline cache buffers is non-empty
a61af66fc99e Initial load
duke
parents:
diff changeset
429 if (!InlineCacheBuffer::is_empty()) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
430 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
431 }
a61af66fc99e Initial load
duke
parents:
diff changeset
432
a61af66fc99e Initial load
duke
parents:
diff changeset
433 jlong CounterDecay::_last_timestamp = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
434
a61af66fc99e Initial load
duke
parents:
diff changeset
435 static void do_method(methodOop m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
436 m->invocation_counter()->decay();
a61af66fc99e Initial load
duke
parents:
diff changeset
437 }
a61af66fc99e Initial load
duke
parents:
diff changeset
438
a61af66fc99e Initial load
duke
parents:
diff changeset
439 void CounterDecay::decay() {
a61af66fc99e Initial load
duke
parents:
diff changeset
440 _last_timestamp = os::javaTimeMillis();
a61af66fc99e Initial load
duke
parents:
diff changeset
441
a61af66fc99e Initial load
duke
parents:
diff changeset
442 // This operation is going to be performed only at the end of a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
443 // and hence GC's will not be going on, all Java mutators are suspended
a61af66fc99e Initial load
duke
parents:
diff changeset
444 // at this point and hence SystemDictionary_lock is also not needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
445 assert(SafepointSynchronize::is_at_safepoint(), "can only be executed at a safepoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
446 int nclasses = SystemDictionary::number_of_classes();
a61af66fc99e Initial load
duke
parents:
diff changeset
447 double classes_per_tick = nclasses * (CounterDecayMinIntervalLength * 1e-3 /
a61af66fc99e Initial load
duke
parents:
diff changeset
448 CounterHalfLifeTime);
a61af66fc99e Initial load
duke
parents:
diff changeset
449 for (int i = 0; i < classes_per_tick; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
450 klassOop k = SystemDictionary::try_get_next_class();
a61af66fc99e Initial load
duke
parents:
diff changeset
451 if (k != NULL && k->klass_part()->oop_is_instance()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
452 instanceKlass::cast(k)->methods_do(do_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
453 }
a61af66fc99e Initial load
duke
parents:
diff changeset
454 }
a61af66fc99e Initial load
duke
parents:
diff changeset
455 }
a61af66fc99e Initial load
duke
parents:
diff changeset
456
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // Various cleaning tasks that should be done periodically at safepoints
a61af66fc99e Initial load
duke
parents:
diff changeset
458 void SafepointSynchronize::do_cleanup_tasks() {
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
459 {
1321
0f6600cee529 6934758: Expose the break down of clean up task time during safepoint.
xlu
parents: 1291
diff changeset
460 TraceTime t1("deflating idle monitors", TraceSafepointCleanupTime);
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
461 ObjectSynchronizer::deflate_idle_monitors();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
462 }
a61af66fc99e Initial load
duke
parents:
diff changeset
463
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
464 {
1321
0f6600cee529 6934758: Expose the break down of clean up task time during safepoint.
xlu
parents: 1291
diff changeset
465 TraceTime t2("updating inline caches", TraceSafepointCleanupTime);
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
466 InlineCacheBuffer::update_inline_caches();
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
467 }
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
468
0
a61af66fc99e Initial load
duke
parents:
diff changeset
469 if(UseCounterDecay && CounterDecay::is_decay_needed()) {
1321
0f6600cee529 6934758: Expose the break down of clean up task time during safepoint.
xlu
parents: 1291
diff changeset
470 TraceTime t3("decaying counter", TraceSafepointCleanupTime);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
471 CounterDecay::decay();
a61af66fc99e Initial load
duke
parents:
diff changeset
472 }
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
473
1321
0f6600cee529 6934758: Expose the break down of clean up task time during safepoint.
xlu
parents: 1291
diff changeset
474 TraceTime t4("sweeping nmethods", TraceSafepointCleanupTime);
1538
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1490
diff changeset
475 NMethodSweeper::scan_stacks();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
476 }
a61af66fc99e Initial load
duke
parents:
diff changeset
477
a61af66fc99e Initial load
duke
parents:
diff changeset
478
a61af66fc99e Initial load
duke
parents:
diff changeset
479 bool SafepointSynchronize::safepoint_safe(JavaThread *thread, JavaThreadState state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
480 switch(state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
481 case _thread_in_native:
a61af66fc99e Initial load
duke
parents:
diff changeset
482 // native threads are safe if they have no java stack or have walkable stack
a61af66fc99e Initial load
duke
parents:
diff changeset
483 return !thread->has_last_Java_frame() || thread->frame_anchor()->walkable();
a61af66fc99e Initial load
duke
parents:
diff changeset
484
a61af66fc99e Initial load
duke
parents:
diff changeset
485 // blocked threads should have already have walkable stack
a61af66fc99e Initial load
duke
parents:
diff changeset
486 case _thread_blocked:
a61af66fc99e Initial load
duke
parents:
diff changeset
487 assert(!thread->has_last_Java_frame() || thread->frame_anchor()->walkable(), "blocked and not walkable");
a61af66fc99e Initial load
duke
parents:
diff changeset
488 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
489
a61af66fc99e Initial load
duke
parents:
diff changeset
490 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
491 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
492 }
a61af66fc99e Initial load
duke
parents:
diff changeset
493 }
a61af66fc99e Initial load
duke
parents:
diff changeset
494
a61af66fc99e Initial load
duke
parents:
diff changeset
495
a61af66fc99e Initial load
duke
parents:
diff changeset
496 // -------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
497 // Implementation of Safepoint callback point
a61af66fc99e Initial load
duke
parents:
diff changeset
498
a61af66fc99e Initial load
duke
parents:
diff changeset
499 void SafepointSynchronize::block(JavaThread *thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
500 assert(thread != NULL, "thread must be set");
a61af66fc99e Initial load
duke
parents:
diff changeset
501 assert(thread->is_Java_thread(), "not a Java thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
502
a61af66fc99e Initial load
duke
parents:
diff changeset
503 // Threads shouldn't block if they are in the middle of printing, but...
a61af66fc99e Initial load
duke
parents:
diff changeset
504 ttyLocker::break_tty_lock_for_safepoint(os::current_thread_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
505
a61af66fc99e Initial load
duke
parents:
diff changeset
506 // Only bail from the block() call if the thread is gone from the
a61af66fc99e Initial load
duke
parents:
diff changeset
507 // thread list; starting to exit should still block.
a61af66fc99e Initial load
duke
parents:
diff changeset
508 if (thread->is_terminated()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
509 // block current thread if we come here from native code when VM is gone
a61af66fc99e Initial load
duke
parents:
diff changeset
510 thread->block_if_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
511
a61af66fc99e Initial load
duke
parents:
diff changeset
512 // otherwise do nothing
a61af66fc99e Initial load
duke
parents:
diff changeset
513 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
514 }
a61af66fc99e Initial load
duke
parents:
diff changeset
515
a61af66fc99e Initial load
duke
parents:
diff changeset
516 JavaThreadState state = thread->thread_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
517 thread->frame_anchor()->make_walkable(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
518
a61af66fc99e Initial load
duke
parents:
diff changeset
519 // Check that we have a valid thread_state at this point
a61af66fc99e Initial load
duke
parents:
diff changeset
520 switch(state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
521 case _thread_in_vm_trans:
a61af66fc99e Initial load
duke
parents:
diff changeset
522 case _thread_in_Java: // From compiled code
a61af66fc99e Initial load
duke
parents:
diff changeset
523
a61af66fc99e Initial load
duke
parents:
diff changeset
524 // We are highly likely to block on the Safepoint_lock. In order to avoid blocking in this case,
a61af66fc99e Initial load
duke
parents:
diff changeset
525 // we pretend we are still in the VM.
a61af66fc99e Initial load
duke
parents:
diff changeset
526 thread->set_thread_state(_thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
527
a61af66fc99e Initial load
duke
parents:
diff changeset
528 if (is_synchronizing()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
529 Atomic::inc (&TryingToBlock) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
530 }
a61af66fc99e Initial load
duke
parents:
diff changeset
531
a61af66fc99e Initial load
duke
parents:
diff changeset
532 // We will always be holding the Safepoint_lock when we are examine the state
a61af66fc99e Initial load
duke
parents:
diff changeset
533 // of a thread. Hence, the instructions between the Safepoint_lock->lock() and
a61af66fc99e Initial load
duke
parents:
diff changeset
534 // Safepoint_lock->unlock() are happening atomic with regards to the safepoint code
a61af66fc99e Initial load
duke
parents:
diff changeset
535 Safepoint_lock->lock_without_safepoint_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
536 if (is_synchronizing()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
537 // Decrement the number of threads to wait for and signal vm thread
a61af66fc99e Initial load
duke
parents:
diff changeset
538 assert(_waiting_to_block > 0, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
539 _waiting_to_block--;
a61af66fc99e Initial load
duke
parents:
diff changeset
540 thread->safepoint_state()->set_has_called_back(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
541
a61af66fc99e Initial load
duke
parents:
diff changeset
542 // Consider (_waiting_to_block < 2) to pipeline the wakeup of the VM thread
a61af66fc99e Initial load
duke
parents:
diff changeset
543 if (_waiting_to_block == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
544 Safepoint_lock->notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
545 }
a61af66fc99e Initial load
duke
parents:
diff changeset
546 }
a61af66fc99e Initial load
duke
parents:
diff changeset
547
a61af66fc99e Initial load
duke
parents:
diff changeset
548 // We transition the thread to state _thread_blocked here, but
a61af66fc99e Initial load
duke
parents:
diff changeset
549 // we can't do our usual check for external suspension and then
a61af66fc99e Initial load
duke
parents:
diff changeset
550 // self-suspend after the lock_without_safepoint_check() call
a61af66fc99e Initial load
duke
parents:
diff changeset
551 // below because we are often called during transitions while
a61af66fc99e Initial load
duke
parents:
diff changeset
552 // we hold different locks. That would leave us suspended while
a61af66fc99e Initial load
duke
parents:
diff changeset
553 // holding a resource which results in deadlocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
554 thread->set_thread_state(_thread_blocked);
a61af66fc99e Initial load
duke
parents:
diff changeset
555 Safepoint_lock->unlock();
a61af66fc99e Initial load
duke
parents:
diff changeset
556
a61af66fc99e Initial load
duke
parents:
diff changeset
557 // We now try to acquire the threads lock. Since this lock is hold by the VM thread during
a61af66fc99e Initial load
duke
parents:
diff changeset
558 // the entire safepoint, the threads will all line up here during the safepoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
559 Threads_lock->lock_without_safepoint_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
560 // restore original state. This is important if the thread comes from compiled code, so it
a61af66fc99e Initial load
duke
parents:
diff changeset
561 // will continue to execute with the _thread_in_Java state.
a61af66fc99e Initial load
duke
parents:
diff changeset
562 thread->set_thread_state(state);
a61af66fc99e Initial load
duke
parents:
diff changeset
563 Threads_lock->unlock();
a61af66fc99e Initial load
duke
parents:
diff changeset
564 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
565
a61af66fc99e Initial load
duke
parents:
diff changeset
566 case _thread_in_native_trans:
a61af66fc99e Initial load
duke
parents:
diff changeset
567 case _thread_blocked_trans:
a61af66fc99e Initial load
duke
parents:
diff changeset
568 case _thread_new_trans:
a61af66fc99e Initial load
duke
parents:
diff changeset
569 if (thread->safepoint_state()->type() == ThreadSafepointState::_call_back) {
a61af66fc99e Initial load
duke
parents:
diff changeset
570 thread->print_thread_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
571 fatal("Deadlock in safepoint code. "
a61af66fc99e Initial load
duke
parents:
diff changeset
572 "Should have called back to the VM before blocking.");
a61af66fc99e Initial load
duke
parents:
diff changeset
573 }
a61af66fc99e Initial load
duke
parents:
diff changeset
574
a61af66fc99e Initial load
duke
parents:
diff changeset
575 // We transition the thread to state _thread_blocked here, but
a61af66fc99e Initial load
duke
parents:
diff changeset
576 // we can't do our usual check for external suspension and then
a61af66fc99e Initial load
duke
parents:
diff changeset
577 // self-suspend after the lock_without_safepoint_check() call
a61af66fc99e Initial load
duke
parents:
diff changeset
578 // below because we are often called during transitions while
a61af66fc99e Initial load
duke
parents:
diff changeset
579 // we hold different locks. That would leave us suspended while
a61af66fc99e Initial load
duke
parents:
diff changeset
580 // holding a resource which results in deadlocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
581 thread->set_thread_state(_thread_blocked);
a61af66fc99e Initial load
duke
parents:
diff changeset
582
a61af66fc99e Initial load
duke
parents:
diff changeset
583 // It is not safe to suspend a thread if we discover it is in _thread_in_native_trans. Hence,
a61af66fc99e Initial load
duke
parents:
diff changeset
584 // the safepoint code might still be waiting for it to block. We need to change the state here,
a61af66fc99e Initial load
duke
parents:
diff changeset
585 // so it can see that it is at a safepoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
586
a61af66fc99e Initial load
duke
parents:
diff changeset
587 // Block until the safepoint operation is completed.
a61af66fc99e Initial load
duke
parents:
diff changeset
588 Threads_lock->lock_without_safepoint_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
589
a61af66fc99e Initial load
duke
parents:
diff changeset
590 // Restore state
a61af66fc99e Initial load
duke
parents:
diff changeset
591 thread->set_thread_state(state);
a61af66fc99e Initial load
duke
parents:
diff changeset
592
a61af66fc99e Initial load
duke
parents:
diff changeset
593 Threads_lock->unlock();
a61af66fc99e Initial load
duke
parents:
diff changeset
594 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
595
a61af66fc99e Initial load
duke
parents:
diff changeset
596 default:
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 1321
diff changeset
597 fatal(err_msg("Illegal threadstate encountered: %d", state));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
598 }
a61af66fc99e Initial load
duke
parents:
diff changeset
599
a61af66fc99e Initial load
duke
parents:
diff changeset
600 // Check for pending. async. exceptions or suspends - except if the
a61af66fc99e Initial load
duke
parents:
diff changeset
601 // thread was blocked inside the VM. has_special_runtime_exit_condition()
a61af66fc99e Initial load
duke
parents:
diff changeset
602 // is called last since it grabs a lock and we only want to do that when
a61af66fc99e Initial load
duke
parents:
diff changeset
603 // we must.
a61af66fc99e Initial load
duke
parents:
diff changeset
604 //
a61af66fc99e Initial load
duke
parents:
diff changeset
605 // Note: we never deliver an async exception at a polling point as the
a61af66fc99e Initial load
duke
parents:
diff changeset
606 // compiler may not have an exception handler for it. The polling
a61af66fc99e Initial load
duke
parents:
diff changeset
607 // code will notice the async and deoptimize and the exception will
a61af66fc99e Initial load
duke
parents:
diff changeset
608 // be delivered. (Polling at a return point is ok though). Sure is
a61af66fc99e Initial load
duke
parents:
diff changeset
609 // a lot of bother for a deprecated feature...
a61af66fc99e Initial load
duke
parents:
diff changeset
610 //
a61af66fc99e Initial load
duke
parents:
diff changeset
611 // We don't deliver an async exception if the thread state is
a61af66fc99e Initial load
duke
parents:
diff changeset
612 // _thread_in_native_trans so JNI functions won't be called with
a61af66fc99e Initial load
duke
parents:
diff changeset
613 // a surprising pending exception. If the thread state is going back to java,
a61af66fc99e Initial load
duke
parents:
diff changeset
614 // async exception is checked in check_special_condition_for_native_trans().
a61af66fc99e Initial load
duke
parents:
diff changeset
615
a61af66fc99e Initial load
duke
parents:
diff changeset
616 if (state != _thread_blocked_trans &&
a61af66fc99e Initial load
duke
parents:
diff changeset
617 state != _thread_in_vm_trans &&
a61af66fc99e Initial load
duke
parents:
diff changeset
618 thread->has_special_runtime_exit_condition()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
619 thread->handle_special_runtime_exit_condition(
a61af66fc99e Initial load
duke
parents:
diff changeset
620 !thread->is_at_poll_safepoint() && (state != _thread_in_native_trans));
a61af66fc99e Initial load
duke
parents:
diff changeset
621 }
a61af66fc99e Initial load
duke
parents:
diff changeset
622 }
a61af66fc99e Initial load
duke
parents:
diff changeset
623
a61af66fc99e Initial load
duke
parents:
diff changeset
624 // ------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
625 // Exception handlers
a61af66fc99e Initial load
duke
parents:
diff changeset
626
a61af66fc99e Initial load
duke
parents:
diff changeset
627 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
628 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
629 #define PTR_PAD ""
a61af66fc99e Initial load
duke
parents:
diff changeset
630 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
631 #define PTR_PAD " "
a61af66fc99e Initial load
duke
parents:
diff changeset
632 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
633
a61af66fc99e Initial load
duke
parents:
diff changeset
634 static void print_ptrs(intptr_t oldptr, intptr_t newptr, bool wasoop) {
a61af66fc99e Initial load
duke
parents:
diff changeset
635 bool is_oop = newptr ? ((oop)newptr)->is_oop() : false;
a61af66fc99e Initial load
duke
parents:
diff changeset
636 tty->print_cr(PTR_FORMAT PTR_PAD " %s %c " PTR_FORMAT PTR_PAD " %s %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
637 oldptr, wasoop?"oop":" ", oldptr == newptr ? ' ' : '!',
a61af66fc99e Initial load
duke
parents:
diff changeset
638 newptr, is_oop?"oop":" ", (wasoop && !is_oop) ? "STALE" : ((wasoop==false&&is_oop==false&&oldptr !=newptr)?"STOMP":" "));
a61af66fc99e Initial load
duke
parents:
diff changeset
639 }
a61af66fc99e Initial load
duke
parents:
diff changeset
640
a61af66fc99e Initial load
duke
parents:
diff changeset
641 static void print_longs(jlong oldptr, jlong newptr, bool wasoop) {
a61af66fc99e Initial load
duke
parents:
diff changeset
642 bool is_oop = newptr ? ((oop)(intptr_t)newptr)->is_oop() : false;
a61af66fc99e Initial load
duke
parents:
diff changeset
643 tty->print_cr(PTR64_FORMAT " %s %c " PTR64_FORMAT " %s %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
644 oldptr, wasoop?"oop":" ", oldptr == newptr ? ' ' : '!',
a61af66fc99e Initial load
duke
parents:
diff changeset
645 newptr, is_oop?"oop":" ", (wasoop && !is_oop) ? "STALE" : ((wasoop==false&&is_oop==false&&oldptr !=newptr)?"STOMP":" "));
a61af66fc99e Initial load
duke
parents:
diff changeset
646 }
a61af66fc99e Initial load
duke
parents:
diff changeset
647
a61af66fc99e Initial load
duke
parents:
diff changeset
648 #ifdef SPARC
a61af66fc99e Initial load
duke
parents:
diff changeset
649 static void print_me(intptr_t *new_sp, intptr_t *old_sp, bool *was_oops) {
a61af66fc99e Initial load
duke
parents:
diff changeset
650 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
651 tty->print_cr("--------+------address-----+------before-----------+-------after----------+");
a61af66fc99e Initial load
duke
parents:
diff changeset
652 const int incr = 1; // Increment to skip a long, in units of intptr_t
a61af66fc99e Initial load
duke
parents:
diff changeset
653 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
654 tty->print_cr("--------+--address-+------before-----------+-------after----------+");
a61af66fc99e Initial load
duke
parents:
diff changeset
655 const int incr = 2; // Increment to skip a long, in units of intptr_t
a61af66fc99e Initial load
duke
parents:
diff changeset
656 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
657 tty->print_cr("---SP---|");
a61af66fc99e Initial load
duke
parents:
diff changeset
658 for( int i=0; i<16; i++ ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
659 tty->print("blob %c%d |"PTR_FORMAT" ","LO"[i>>3],i&7,new_sp); print_ptrs(*old_sp++,*new_sp++,*was_oops++); }
a61af66fc99e Initial load
duke
parents:
diff changeset
660 tty->print_cr("--------|");
a61af66fc99e Initial load
duke
parents:
diff changeset
661 for( int i1=0; i1<frame::memory_parameter_word_sp_offset-16; i1++ ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
662 tty->print("argv pad|"PTR_FORMAT" ",new_sp); print_ptrs(*old_sp++,*new_sp++,*was_oops++); }
a61af66fc99e Initial load
duke
parents:
diff changeset
663 tty->print(" pad|"PTR_FORMAT" ",new_sp); print_ptrs(*old_sp++,*new_sp++,*was_oops++);
a61af66fc99e Initial load
duke
parents:
diff changeset
664 tty->print_cr("--------|");
a61af66fc99e Initial load
duke
parents:
diff changeset
665 tty->print(" G1 |"PTR_FORMAT" ",new_sp); print_longs(*(jlong*)old_sp,*(jlong*)new_sp,was_oops[incr-1]); old_sp += incr; new_sp += incr; was_oops += incr;
a61af66fc99e Initial load
duke
parents:
diff changeset
666 tty->print(" G3 |"PTR_FORMAT" ",new_sp); print_longs(*(jlong*)old_sp,*(jlong*)new_sp,was_oops[incr-1]); old_sp += incr; new_sp += incr; was_oops += incr;
a61af66fc99e Initial load
duke
parents:
diff changeset
667 tty->print(" G4 |"PTR_FORMAT" ",new_sp); print_longs(*(jlong*)old_sp,*(jlong*)new_sp,was_oops[incr-1]); old_sp += incr; new_sp += incr; was_oops += incr;
a61af66fc99e Initial load
duke
parents:
diff changeset
668 tty->print(" G5 |"PTR_FORMAT" ",new_sp); print_longs(*(jlong*)old_sp,*(jlong*)new_sp,was_oops[incr-1]); old_sp += incr; new_sp += incr; was_oops += incr;
a61af66fc99e Initial load
duke
parents:
diff changeset
669 tty->print_cr(" FSR |"PTR_FORMAT" "PTR64_FORMAT" "PTR64_FORMAT,new_sp,*(jlong*)old_sp,*(jlong*)new_sp);
a61af66fc99e Initial load
duke
parents:
diff changeset
670 old_sp += incr; new_sp += incr; was_oops += incr;
a61af66fc99e Initial load
duke
parents:
diff changeset
671 // Skip the floats
a61af66fc99e Initial load
duke
parents:
diff changeset
672 tty->print_cr("--Float-|"PTR_FORMAT,new_sp);
a61af66fc99e Initial load
duke
parents:
diff changeset
673 tty->print_cr("---FP---|");
a61af66fc99e Initial load
duke
parents:
diff changeset
674 old_sp += incr*32; new_sp += incr*32; was_oops += incr*32;
a61af66fc99e Initial load
duke
parents:
diff changeset
675 for( int i2=0; i2<16; i2++ ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
676 tty->print("call %c%d |"PTR_FORMAT" ","LI"[i2>>3],i2&7,new_sp); print_ptrs(*old_sp++,*new_sp++,*was_oops++); }
a61af66fc99e Initial load
duke
parents:
diff changeset
677 tty->print_cr("");
a61af66fc99e Initial load
duke
parents:
diff changeset
678 }
a61af66fc99e Initial load
duke
parents:
diff changeset
679 #endif // SPARC
a61af66fc99e Initial load
duke
parents:
diff changeset
680 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
681
a61af66fc99e Initial load
duke
parents:
diff changeset
682
a61af66fc99e Initial load
duke
parents:
diff changeset
683 void SafepointSynchronize::handle_polling_page_exception(JavaThread *thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
684 assert(thread->is_Java_thread(), "polling reference encountered by VM thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
685 assert(thread->thread_state() == _thread_in_Java, "should come from Java code");
a61af66fc99e Initial load
duke
parents:
diff changeset
686 assert(SafepointSynchronize::is_synchronizing(), "polling encountered outside safepoint synchronization");
a61af66fc99e Initial load
duke
parents:
diff changeset
687
a61af66fc99e Initial load
duke
parents:
diff changeset
688 // Uncomment this to get some serious before/after printing of the
a61af66fc99e Initial load
duke
parents:
diff changeset
689 // Sparc safepoint-blob frame structure.
a61af66fc99e Initial load
duke
parents:
diff changeset
690 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
691 intptr_t* sp = thread->last_Java_sp();
a61af66fc99e Initial load
duke
parents:
diff changeset
692 intptr_t stack_copy[150];
a61af66fc99e Initial load
duke
parents:
diff changeset
693 for( int i=0; i<150; i++ ) stack_copy[i] = sp[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
694 bool was_oops[150];
a61af66fc99e Initial load
duke
parents:
diff changeset
695 for( int i=0; i<150; i++ )
a61af66fc99e Initial load
duke
parents:
diff changeset
696 was_oops[i] = stack_copy[i] ? ((oop)stack_copy[i])->is_oop() : false;
a61af66fc99e Initial load
duke
parents:
diff changeset
697 */
a61af66fc99e Initial load
duke
parents:
diff changeset
698
a61af66fc99e Initial load
duke
parents:
diff changeset
699 if (ShowSafepointMsgs) {
a61af66fc99e Initial load
duke
parents:
diff changeset
700 tty->print("handle_polling_page_exception: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
701 }
a61af66fc99e Initial load
duke
parents:
diff changeset
702
a61af66fc99e Initial load
duke
parents:
diff changeset
703 if (PrintSafepointStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
704 inc_page_trap_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
705 }
a61af66fc99e Initial load
duke
parents:
diff changeset
706
a61af66fc99e Initial load
duke
parents:
diff changeset
707 ThreadSafepointState* state = thread->safepoint_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
708
a61af66fc99e Initial load
duke
parents:
diff changeset
709 state->handle_polling_page_exception();
a61af66fc99e Initial load
duke
parents:
diff changeset
710 // print_me(sp,stack_copy,was_oops);
a61af66fc99e Initial load
duke
parents:
diff changeset
711 }
a61af66fc99e Initial load
duke
parents:
diff changeset
712
a61af66fc99e Initial load
duke
parents:
diff changeset
713
a61af66fc99e Initial load
duke
parents:
diff changeset
714 void SafepointSynchronize::print_safepoint_timeout(SafepointTimeoutReason reason) {
a61af66fc99e Initial load
duke
parents:
diff changeset
715 if (!timeout_error_printed) {
a61af66fc99e Initial load
duke
parents:
diff changeset
716 timeout_error_printed = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
717 // Print out the thread infor which didn't reach the safepoint for debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
718 // purposes (useful when there are lots of threads in the debugger).
a61af66fc99e Initial load
duke
parents:
diff changeset
719 tty->print_cr("");
a61af66fc99e Initial load
duke
parents:
diff changeset
720 tty->print_cr("# SafepointSynchronize::begin: Timeout detected:");
a61af66fc99e Initial load
duke
parents:
diff changeset
721 if (reason == _spinning_timeout) {
a61af66fc99e Initial load
duke
parents:
diff changeset
722 tty->print_cr("# SafepointSynchronize::begin: Timed out while spinning to reach a safepoint.");
a61af66fc99e Initial load
duke
parents:
diff changeset
723 } else if (reason == _blocking_timeout) {
a61af66fc99e Initial load
duke
parents:
diff changeset
724 tty->print_cr("# SafepointSynchronize::begin: Timed out while waiting for threads to stop.");
a61af66fc99e Initial load
duke
parents:
diff changeset
725 }
a61af66fc99e Initial load
duke
parents:
diff changeset
726
a61af66fc99e Initial load
duke
parents:
diff changeset
727 tty->print_cr("# SafepointSynchronize::begin: Threads which did not reach the safepoint:");
a61af66fc99e Initial load
duke
parents:
diff changeset
728 ThreadSafepointState *cur_state;
a61af66fc99e Initial load
duke
parents:
diff changeset
729 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
730 for(JavaThread *cur_thread = Threads::first(); cur_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
731 cur_thread = cur_thread->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
732 cur_state = cur_thread->safepoint_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
733
a61af66fc99e Initial load
duke
parents:
diff changeset
734 if (cur_thread->thread_state() != _thread_blocked &&
a61af66fc99e Initial load
duke
parents:
diff changeset
735 ((reason == _spinning_timeout && cur_state->is_running()) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
736 (reason == _blocking_timeout && !cur_state->has_called_back()))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
737 tty->print("# ");
a61af66fc99e Initial load
duke
parents:
diff changeset
738 cur_thread->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
739 tty->print_cr("");
a61af66fc99e Initial load
duke
parents:
diff changeset
740 }
a61af66fc99e Initial load
duke
parents:
diff changeset
741 }
a61af66fc99e Initial load
duke
parents:
diff changeset
742 tty->print_cr("# SafepointSynchronize::begin: (End of list)");
a61af66fc99e Initial load
duke
parents:
diff changeset
743 }
a61af66fc99e Initial load
duke
parents:
diff changeset
744
a61af66fc99e Initial load
duke
parents:
diff changeset
745 // To debug the long safepoint, specify both DieOnSafepointTimeout &
a61af66fc99e Initial load
duke
parents:
diff changeset
746 // ShowMessageBoxOnError.
a61af66fc99e Initial load
duke
parents:
diff changeset
747 if (DieOnSafepointTimeout) {
a61af66fc99e Initial load
duke
parents:
diff changeset
748 char msg[1024];
a61af66fc99e Initial load
duke
parents:
diff changeset
749 VM_Operation *op = VMThread::vm_operation();
513
2328d1d3f8cf 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 0
diff changeset
750 sprintf(msg, "Safepoint sync time longer than " INTX_FORMAT "ms detected when executing %s.",
0
a61af66fc99e Initial load
duke
parents:
diff changeset
751 SafepointTimeoutDelay,
a61af66fc99e Initial load
duke
parents:
diff changeset
752 op != NULL ? op->name() : "no vm operation");
a61af66fc99e Initial load
duke
parents:
diff changeset
753 fatal(msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
754 }
a61af66fc99e Initial load
duke
parents:
diff changeset
755 }
a61af66fc99e Initial load
duke
parents:
diff changeset
756
a61af66fc99e Initial load
duke
parents:
diff changeset
757
a61af66fc99e Initial load
duke
parents:
diff changeset
758 // -------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
759 // Implementation of ThreadSafepointState
a61af66fc99e Initial load
duke
parents:
diff changeset
760
a61af66fc99e Initial load
duke
parents:
diff changeset
761 ThreadSafepointState::ThreadSafepointState(JavaThread *thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
762 _thread = thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
763 _type = _running;
a61af66fc99e Initial load
duke
parents:
diff changeset
764 _has_called_back = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
765 _at_poll_safepoint = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
766 }
a61af66fc99e Initial load
duke
parents:
diff changeset
767
a61af66fc99e Initial load
duke
parents:
diff changeset
768 void ThreadSafepointState::create(JavaThread *thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
769 ThreadSafepointState *state = new ThreadSafepointState(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
770 thread->set_safepoint_state(state);
a61af66fc99e Initial load
duke
parents:
diff changeset
771 }
a61af66fc99e Initial load
duke
parents:
diff changeset
772
a61af66fc99e Initial load
duke
parents:
diff changeset
773 void ThreadSafepointState::destroy(JavaThread *thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
774 if (thread->safepoint_state()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
775 delete(thread->safepoint_state());
a61af66fc99e Initial load
duke
parents:
diff changeset
776 thread->set_safepoint_state(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
777 }
a61af66fc99e Initial load
duke
parents:
diff changeset
778 }
a61af66fc99e Initial load
duke
parents:
diff changeset
779
a61af66fc99e Initial load
duke
parents:
diff changeset
780 void ThreadSafepointState::examine_state_of_thread() {
a61af66fc99e Initial load
duke
parents:
diff changeset
781 assert(is_running(), "better be running or just have hit safepoint poll");
a61af66fc99e Initial load
duke
parents:
diff changeset
782
a61af66fc99e Initial load
duke
parents:
diff changeset
783 JavaThreadState state = _thread->thread_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
784
a61af66fc99e Initial load
duke
parents:
diff changeset
785 // Check for a thread that is suspended. Note that thread resume tries
a61af66fc99e Initial load
duke
parents:
diff changeset
786 // to grab the Threads_lock which we own here, so a thread cannot be
a61af66fc99e Initial load
duke
parents:
diff changeset
787 // resumed during safepoint synchronization.
a61af66fc99e Initial load
duke
parents:
diff changeset
788
979
87770dcf831b 6876794: 4/4 sp07t002 hangs very intermittently
dcubed
parents: 845
diff changeset
789 // We check to see if this thread is suspended without locking to
87770dcf831b 6876794: 4/4 sp07t002 hangs very intermittently
dcubed
parents: 845
diff changeset
790 // avoid deadlocking with a third thread that is waiting for this
87770dcf831b 6876794: 4/4 sp07t002 hangs very intermittently
dcubed
parents: 845
diff changeset
791 // thread to be suspended. The third thread can notice the safepoint
87770dcf831b 6876794: 4/4 sp07t002 hangs very intermittently
dcubed
parents: 845
diff changeset
792 // that we're trying to start at the beginning of its SR_lock->wait()
87770dcf831b 6876794: 4/4 sp07t002 hangs very intermittently
dcubed
parents: 845
diff changeset
793 // call. If that happens, then the third thread will block on the
87770dcf831b 6876794: 4/4 sp07t002 hangs very intermittently
dcubed
parents: 845
diff changeset
794 // safepoint while still holding the underlying SR_lock. We won't be
87770dcf831b 6876794: 4/4 sp07t002 hangs very intermittently
dcubed
parents: 845
diff changeset
795 // able to get the SR_lock and we'll deadlock.
87770dcf831b 6876794: 4/4 sp07t002 hangs very intermittently
dcubed
parents: 845
diff changeset
796 //
87770dcf831b 6876794: 4/4 sp07t002 hangs very intermittently
dcubed
parents: 845
diff changeset
797 // We don't need to grab the SR_lock here for two reasons:
87770dcf831b 6876794: 4/4 sp07t002 hangs very intermittently
dcubed
parents: 845
diff changeset
798 // 1) The suspend flags are both volatile and are set with an
87770dcf831b 6876794: 4/4 sp07t002 hangs very intermittently
dcubed
parents: 845
diff changeset
799 // Atomic::cmpxchg() call so we should see the suspended
87770dcf831b 6876794: 4/4 sp07t002 hangs very intermittently
dcubed
parents: 845
diff changeset
800 // state right away.
87770dcf831b 6876794: 4/4 sp07t002 hangs very intermittently
dcubed
parents: 845
diff changeset
801 // 2) We're being called from the safepoint polling loop; if
87770dcf831b 6876794: 4/4 sp07t002 hangs very intermittently
dcubed
parents: 845
diff changeset
802 // we don't see the suspended state on this iteration, then
87770dcf831b 6876794: 4/4 sp07t002 hangs very intermittently
dcubed
parents: 845
diff changeset
803 // we'll come around again.
87770dcf831b 6876794: 4/4 sp07t002 hangs very intermittently
dcubed
parents: 845
diff changeset
804 //
87770dcf831b 6876794: 4/4 sp07t002 hangs very intermittently
dcubed
parents: 845
diff changeset
805 bool is_suspended = _thread->is_ext_suspended();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
806 if (is_suspended) {
a61af66fc99e Initial load
duke
parents:
diff changeset
807 roll_forward(_at_safepoint);
a61af66fc99e Initial load
duke
parents:
diff changeset
808 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
809 }
a61af66fc99e Initial load
duke
parents:
diff changeset
810
a61af66fc99e Initial load
duke
parents:
diff changeset
811 // Some JavaThread states have an initial safepoint state of
a61af66fc99e Initial load
duke
parents:
diff changeset
812 // running, but are actually at a safepoint. We will happily
a61af66fc99e Initial load
duke
parents:
diff changeset
813 // agree and update the safepoint state here.
a61af66fc99e Initial load
duke
parents:
diff changeset
814 if (SafepointSynchronize::safepoint_safe(_thread, state)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
815 roll_forward(_at_safepoint);
a61af66fc99e Initial load
duke
parents:
diff changeset
816 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
817 }
a61af66fc99e Initial load
duke
parents:
diff changeset
818
a61af66fc99e Initial load
duke
parents:
diff changeset
819 if (state == _thread_in_vm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
820 roll_forward(_call_back);
a61af66fc99e Initial load
duke
parents:
diff changeset
821 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
822 }
a61af66fc99e Initial load
duke
parents:
diff changeset
823
a61af66fc99e Initial load
duke
parents:
diff changeset
824 // All other thread states will continue to run until they
a61af66fc99e Initial load
duke
parents:
diff changeset
825 // transition and self-block in state _blocked
a61af66fc99e Initial load
duke
parents:
diff changeset
826 // Safepoint polling in compiled code causes the Java threads to do the same.
a61af66fc99e Initial load
duke
parents:
diff changeset
827 // Note: new threads may require a malloc so they must be allowed to finish
a61af66fc99e Initial load
duke
parents:
diff changeset
828
a61af66fc99e Initial load
duke
parents:
diff changeset
829 assert(is_running(), "examine_state_of_thread on non-running thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
830 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
831 }
a61af66fc99e Initial load
duke
parents:
diff changeset
832
a61af66fc99e Initial load
duke
parents:
diff changeset
833 // Returns true is thread could not be rolled forward at present position.
a61af66fc99e Initial load
duke
parents:
diff changeset
834 void ThreadSafepointState::roll_forward(suspend_type type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
835 _type = type;
a61af66fc99e Initial load
duke
parents:
diff changeset
836
a61af66fc99e Initial load
duke
parents:
diff changeset
837 switch(_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
838 case _at_safepoint:
a61af66fc99e Initial load
duke
parents:
diff changeset
839 SafepointSynchronize::signal_thread_at_safepoint();
a61af66fc99e Initial load
duke
parents:
diff changeset
840 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
841
a61af66fc99e Initial load
duke
parents:
diff changeset
842 case _call_back:
a61af66fc99e Initial load
duke
parents:
diff changeset
843 set_has_called_back(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
844 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
845
a61af66fc99e Initial load
duke
parents:
diff changeset
846 case _running:
a61af66fc99e Initial load
duke
parents:
diff changeset
847 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
848 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
849 }
a61af66fc99e Initial load
duke
parents:
diff changeset
850 }
a61af66fc99e Initial load
duke
parents:
diff changeset
851
a61af66fc99e Initial load
duke
parents:
diff changeset
852 void ThreadSafepointState::restart() {
a61af66fc99e Initial load
duke
parents:
diff changeset
853 switch(type()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
854 case _at_safepoint:
a61af66fc99e Initial load
duke
parents:
diff changeset
855 case _call_back:
a61af66fc99e Initial load
duke
parents:
diff changeset
856 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
857
a61af66fc99e Initial load
duke
parents:
diff changeset
858 case _running:
a61af66fc99e Initial load
duke
parents:
diff changeset
859 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
860 tty->print_cr("restart thread "INTPTR_FORMAT" with state %d",
a61af66fc99e Initial load
duke
parents:
diff changeset
861 _thread, _type);
a61af66fc99e Initial load
duke
parents:
diff changeset
862 _thread->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
863 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
864 }
a61af66fc99e Initial load
duke
parents:
diff changeset
865 _type = _running;
a61af66fc99e Initial load
duke
parents:
diff changeset
866 set_has_called_back(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
867 }
a61af66fc99e Initial load
duke
parents:
diff changeset
868
a61af66fc99e Initial load
duke
parents:
diff changeset
869
a61af66fc99e Initial load
duke
parents:
diff changeset
870 void ThreadSafepointState::print_on(outputStream *st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
871 const char *s;
a61af66fc99e Initial load
duke
parents:
diff changeset
872
a61af66fc99e Initial load
duke
parents:
diff changeset
873 switch(_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
874 case _running : s = "_running"; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
875 case _at_safepoint : s = "_at_safepoint"; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
876 case _call_back : s = "_call_back"; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
877 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
878 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
879 }
a61af66fc99e Initial load
duke
parents:
diff changeset
880
a61af66fc99e Initial load
duke
parents:
diff changeset
881 st->print_cr("Thread: " INTPTR_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
882 " [0x%2x] State: %s _has_called_back %d _at_poll_safepoint %d",
a61af66fc99e Initial load
duke
parents:
diff changeset
883 _thread, _thread->osthread()->thread_id(), s, _has_called_back,
a61af66fc99e Initial load
duke
parents:
diff changeset
884 _at_poll_safepoint);
a61af66fc99e Initial load
duke
parents:
diff changeset
885
a61af66fc99e Initial load
duke
parents:
diff changeset
886 _thread->print_thread_state_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
887 }
a61af66fc99e Initial load
duke
parents:
diff changeset
888
a61af66fc99e Initial load
duke
parents:
diff changeset
889
a61af66fc99e Initial load
duke
parents:
diff changeset
890 // ---------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
891
a61af66fc99e Initial load
duke
parents:
diff changeset
892 // Block the thread at the safepoint poll or poll return.
a61af66fc99e Initial load
duke
parents:
diff changeset
893 void ThreadSafepointState::handle_polling_page_exception() {
a61af66fc99e Initial load
duke
parents:
diff changeset
894
a61af66fc99e Initial load
duke
parents:
diff changeset
895 // Check state. block() will set thread state to thread_in_vm which will
a61af66fc99e Initial load
duke
parents:
diff changeset
896 // cause the safepoint state _type to become _call_back.
a61af66fc99e Initial load
duke
parents:
diff changeset
897 assert(type() == ThreadSafepointState::_running,
a61af66fc99e Initial load
duke
parents:
diff changeset
898 "polling page exception on thread not running state");
a61af66fc99e Initial load
duke
parents:
diff changeset
899
a61af66fc99e Initial load
duke
parents:
diff changeset
900 // Step 1: Find the nmethod from the return address
a61af66fc99e Initial load
duke
parents:
diff changeset
901 if (ShowSafepointMsgs && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
902 tty->print_cr("Polling page exception at " INTPTR_FORMAT, thread()->saved_exception_pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
903 }
a61af66fc99e Initial load
duke
parents:
diff changeset
904 address real_return_addr = thread()->saved_exception_pc();
a61af66fc99e Initial load
duke
parents:
diff changeset
905
a61af66fc99e Initial load
duke
parents:
diff changeset
906 CodeBlob *cb = CodeCache::find_blob(real_return_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
907 assert(cb != NULL && cb->is_nmethod(), "return address should be in nmethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
908 nmethod* nm = (nmethod*)cb;
a61af66fc99e Initial load
duke
parents:
diff changeset
909
a61af66fc99e Initial load
duke
parents:
diff changeset
910 // Find frame of caller
a61af66fc99e Initial load
duke
parents:
diff changeset
911 frame stub_fr = thread()->last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
912 CodeBlob* stub_cb = stub_fr.cb();
a61af66fc99e Initial load
duke
parents:
diff changeset
913 assert(stub_cb->is_safepoint_stub(), "must be a safepoint stub");
a61af66fc99e Initial load
duke
parents:
diff changeset
914 RegisterMap map(thread(), true);
a61af66fc99e Initial load
duke
parents:
diff changeset
915 frame caller_fr = stub_fr.sender(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
916
a61af66fc99e Initial load
duke
parents:
diff changeset
917 // Should only be poll_return or poll
a61af66fc99e Initial load
duke
parents:
diff changeset
918 assert( nm->is_at_poll_or_poll_return(real_return_addr), "should not be at call" );
a61af66fc99e Initial load
duke
parents:
diff changeset
919
a61af66fc99e Initial load
duke
parents:
diff changeset
920 // This is a poll immediately before a return. The exception handling code
a61af66fc99e Initial load
duke
parents:
diff changeset
921 // has already had the effect of causing the return to occur, so the execution
a61af66fc99e Initial load
duke
parents:
diff changeset
922 // will continue immediately after the call. In addition, the oopmap at the
a61af66fc99e Initial load
duke
parents:
diff changeset
923 // return point does not mark the return value as an oop (if it is), so
a61af66fc99e Initial load
duke
parents:
diff changeset
924 // it needs a handle here to be updated.
a61af66fc99e Initial load
duke
parents:
diff changeset
925 if( nm->is_at_poll_return(real_return_addr) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
926 // See if return type is an oop.
a61af66fc99e Initial load
duke
parents:
diff changeset
927 bool return_oop = nm->method()->is_returning_oop();
a61af66fc99e Initial load
duke
parents:
diff changeset
928 Handle return_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
929 if (return_oop) {
a61af66fc99e Initial load
duke
parents:
diff changeset
930 // The oop result has been saved on the stack together with all
a61af66fc99e Initial load
duke
parents:
diff changeset
931 // the other registers. In order to preserve it over GCs we need
a61af66fc99e Initial load
duke
parents:
diff changeset
932 // to keep it in a handle.
a61af66fc99e Initial load
duke
parents:
diff changeset
933 oop result = caller_fr.saved_oop_result(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
934 assert(result == NULL || result->is_oop(), "must be oop");
a61af66fc99e Initial load
duke
parents:
diff changeset
935 return_value = Handle(thread(), result);
a61af66fc99e Initial load
duke
parents:
diff changeset
936 assert(Universe::heap()->is_in_or_null(result), "must be heap pointer");
a61af66fc99e Initial load
duke
parents:
diff changeset
937 }
a61af66fc99e Initial load
duke
parents:
diff changeset
938
a61af66fc99e Initial load
duke
parents:
diff changeset
939 // Block the thread
a61af66fc99e Initial load
duke
parents:
diff changeset
940 SafepointSynchronize::block(thread());
a61af66fc99e Initial load
duke
parents:
diff changeset
941
a61af66fc99e Initial load
duke
parents:
diff changeset
942 // restore oop result, if any
a61af66fc99e Initial load
duke
parents:
diff changeset
943 if (return_oop) {
a61af66fc99e Initial load
duke
parents:
diff changeset
944 caller_fr.set_saved_oop_result(&map, return_value());
a61af66fc99e Initial load
duke
parents:
diff changeset
945 }
a61af66fc99e Initial load
duke
parents:
diff changeset
946 }
a61af66fc99e Initial load
duke
parents:
diff changeset
947
a61af66fc99e Initial load
duke
parents:
diff changeset
948 // This is a safepoint poll. Verify the return address and block.
a61af66fc99e Initial load
duke
parents:
diff changeset
949 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
950 set_at_poll_safepoint(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
951
a61af66fc99e Initial load
duke
parents:
diff changeset
952 // verify the blob built the "return address" correctly
a61af66fc99e Initial load
duke
parents:
diff changeset
953 assert(real_return_addr == caller_fr.pc(), "must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
954
a61af66fc99e Initial load
duke
parents:
diff changeset
955 // Block the thread
a61af66fc99e Initial load
duke
parents:
diff changeset
956 SafepointSynchronize::block(thread());
a61af66fc99e Initial load
duke
parents:
diff changeset
957 set_at_poll_safepoint(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
958
a61af66fc99e Initial load
duke
parents:
diff changeset
959 // If we have a pending async exception deoptimize the frame
a61af66fc99e Initial load
duke
parents:
diff changeset
960 // as otherwise we may never deliver it.
a61af66fc99e Initial load
duke
parents:
diff changeset
961 if (thread()->has_async_condition()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
962 ThreadInVMfromJavaNoAsyncException __tiv(thread());
a61af66fc99e Initial load
duke
parents:
diff changeset
963 VM_DeoptimizeFrame deopt(thread(), caller_fr.id());
a61af66fc99e Initial load
duke
parents:
diff changeset
964 VMThread::execute(&deopt);
a61af66fc99e Initial load
duke
parents:
diff changeset
965 }
a61af66fc99e Initial load
duke
parents:
diff changeset
966
a61af66fc99e Initial load
duke
parents:
diff changeset
967 // If an exception has been installed we must check for a pending deoptimization
a61af66fc99e Initial load
duke
parents:
diff changeset
968 // Deoptimize frame if exception has been thrown.
a61af66fc99e Initial load
duke
parents:
diff changeset
969
a61af66fc99e Initial load
duke
parents:
diff changeset
970 if (thread()->has_pending_exception() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
971 RegisterMap map(thread(), true);
a61af66fc99e Initial load
duke
parents:
diff changeset
972 frame caller_fr = stub_fr.sender(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
973 if (caller_fr.is_deoptimized_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
974 // The exception patch will destroy registers that are still
a61af66fc99e Initial load
duke
parents:
diff changeset
975 // live and will be needed during deoptimization. Defer the
a61af66fc99e Initial load
duke
parents:
diff changeset
976 // Async exception should have defered the exception until the
a61af66fc99e Initial load
duke
parents:
diff changeset
977 // next safepoint which will be detected when we get into
a61af66fc99e Initial load
duke
parents:
diff changeset
978 // the interpreter so if we have an exception now things
a61af66fc99e Initial load
duke
parents:
diff changeset
979 // are messed up.
a61af66fc99e Initial load
duke
parents:
diff changeset
980
a61af66fc99e Initial load
duke
parents:
diff changeset
981 fatal("Exception installed and deoptimization is pending");
a61af66fc99e Initial load
duke
parents:
diff changeset
982 }
a61af66fc99e Initial load
duke
parents:
diff changeset
983 }
a61af66fc99e Initial load
duke
parents:
diff changeset
984 }
a61af66fc99e Initial load
duke
parents:
diff changeset
985 }
a61af66fc99e Initial load
duke
parents:
diff changeset
986
a61af66fc99e Initial load
duke
parents:
diff changeset
987
a61af66fc99e Initial load
duke
parents:
diff changeset
988 //
a61af66fc99e Initial load
duke
parents:
diff changeset
989 // Statistics & Instrumentations
a61af66fc99e Initial load
duke
parents:
diff changeset
990 //
a61af66fc99e Initial load
duke
parents:
diff changeset
991 SafepointSynchronize::SafepointStats* SafepointSynchronize::_safepoint_stats = NULL;
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
992 jlong SafepointSynchronize::_safepoint_begin_time = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
993 int SafepointSynchronize::_cur_stat_index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
994 julong SafepointSynchronize::_safepoint_reasons[VM_Operation::VMOp_Terminating];
a61af66fc99e Initial load
duke
parents:
diff changeset
995 julong SafepointSynchronize::_coalesced_vmop_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
996 jlong SafepointSynchronize::_max_sync_time = 0;
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
997 jlong SafepointSynchronize::_max_vmop_time = 0;
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
998 float SafepointSynchronize::_ts_of_current_safepoint = 0.0f;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
999
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1000 static jlong cleanup_end_time = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 static bool need_to_track_page_armed_status = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 static bool init_done = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1003
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1004 // Helper method to print the header.
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1005 static void print_header() {
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1006 tty->print(" vmop "
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1007 "[threads: total initially_running wait_to_block] ");
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1008 tty->print("[time: spin block sync cleanup vmop] ");
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1009
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1010 // no page armed status printed out if it is always armed.
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1011 if (need_to_track_page_armed_status) {
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1012 tty->print("page_armed ");
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1013 }
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1014
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1015 tty->print_cr("page_trap_count");
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1016 }
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1017
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 void SafepointSynchronize::deferred_initialize_stat() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 if (init_done) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1020
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 if (PrintSafepointStatisticsCount <= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 fatal("Wrong PrintSafepointStatisticsCount");
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1024
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 // If PrintSafepointStatisticsTimeout is specified, the statistics data will
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 // be printed right away, in which case, _safepoint_stats will regress to
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 // a single element array. Otherwise, it is a circular ring buffer with default
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 // size of PrintSafepointStatisticsCount.
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 int stats_array_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 if (PrintSafepointStatisticsTimeout > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 stats_array_size = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 PrintSafepointStatistics = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 stats_array_size = PrintSafepointStatisticsCount;
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 _safepoint_stats = (SafepointStats*)os::malloc(stats_array_size
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 * sizeof(SafepointStats));
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 guarantee(_safepoint_stats != NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 "not enough memory for safepoint instrumentation data");
a61af66fc99e Initial load
duke
parents:
diff changeset
1040
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 if (UseCompilerSafepoints && DeferPollingPageLoopCount >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 need_to_track_page_armed_status = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 init_done = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1046
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 void SafepointSynchronize::begin_statistics(int nof_threads, int nof_running) {
1003
528d98fe1037 6880029: JDK 1.6.0_u14p Application crashed very early
xlu
parents: 979
diff changeset
1048 assert(init_done, "safepoint statistics array hasn't been initialized");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 SafepointStats *spstat = &_safepoint_stats[_cur_stat_index];
a61af66fc99e Initial load
duke
parents:
diff changeset
1050
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1051 spstat->_time_stamp = _ts_of_current_safepoint;
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1052
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 VM_Operation *op = VMThread::vm_operation();
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 spstat->_vmop_type = (op != NULL ? op->type() : -1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 if (op != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 _safepoint_reasons[spstat->_vmop_type]++;
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1058
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 spstat->_nof_total_threads = nof_threads;
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 spstat->_nof_initial_running_threads = nof_running;
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 spstat->_nof_threads_hit_page_trap = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1062
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 // Records the start time of spinning. The real time spent on spinning
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 // will be adjusted when spin is done. Same trick is applied for time
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 // spent on waiting for threads to block.
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 if (nof_running != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 spstat->_time_to_spin = os::javaTimeNanos();
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 spstat->_time_to_spin = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1072
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 void SafepointSynchronize::update_statistics_on_spin_end() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 SafepointStats *spstat = &_safepoint_stats[_cur_stat_index];
a61af66fc99e Initial load
duke
parents:
diff changeset
1075
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 jlong cur_time = os::javaTimeNanos();
a61af66fc99e Initial load
duke
parents:
diff changeset
1077
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 spstat->_nof_threads_wait_to_block = _waiting_to_block;
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 if (spstat->_nof_initial_running_threads != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 spstat->_time_to_spin = cur_time - spstat->_time_to_spin;
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1082
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 if (need_to_track_page_armed_status) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 spstat->_page_armed = (PageArmed == 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1086
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 // Records the start time of waiting for to block. Updated when block is done.
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 if (_waiting_to_block != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 spstat->_time_to_wait_to_block = cur_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 spstat->_time_to_wait_to_block = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1094
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 void SafepointSynchronize::update_statistics_on_sync_end(jlong end_time) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 SafepointStats *spstat = &_safepoint_stats[_cur_stat_index];
a61af66fc99e Initial load
duke
parents:
diff changeset
1097
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 if (spstat->_nof_threads_wait_to_block != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 spstat->_time_to_wait_to_block = end_time -
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 spstat->_time_to_wait_to_block;
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1102
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 // Records the end time of sync which will be used to calculate the total
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 // vm operation time. Again, the real time spending in syncing will be deducted
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 // from the start of the sync time later when end_statistics is called.
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1106 spstat->_time_to_sync = end_time - _safepoint_begin_time;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 if (spstat->_time_to_sync > _max_sync_time) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 _max_sync_time = spstat->_time_to_sync;
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 }
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1110
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1111 spstat->_time_to_do_cleanups = end_time;
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1112 }
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1113
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1114 void SafepointSynchronize::update_statistics_on_cleanup_end(jlong end_time) {
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1115 SafepointStats *spstat = &_safepoint_stats[_cur_stat_index];
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1116
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1117 // Record how long spent in cleanup tasks.
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1118 spstat->_time_to_do_cleanups = end_time - spstat->_time_to_do_cleanups;
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1119
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1120 cleanup_end_time = end_time;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1122
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 void SafepointSynchronize::end_statistics(jlong vmop_end_time) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 SafepointStats *spstat = &_safepoint_stats[_cur_stat_index];
a61af66fc99e Initial load
duke
parents:
diff changeset
1125
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 // Update the vm operation time.
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1127 spstat->_time_to_exec_vmop = vmop_end_time - cleanup_end_time;
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1128 if (spstat->_time_to_exec_vmop > _max_vmop_time) {
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1129 _max_vmop_time = spstat->_time_to_exec_vmop;
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1130 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 // Only the sync time longer than the specified
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 // PrintSafepointStatisticsTimeout will be printed out right away.
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 // By default, it is -1 meaning all samples will be put into the list.
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 if ( PrintSafepointStatisticsTimeout > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 if (spstat->_time_to_sync > PrintSafepointStatisticsTimeout * MICROUNITS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 // The safepoint statistics will be printed out when the _safepoin_stats
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 // array fills up.
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1141 if (_cur_stat_index == PrintSafepointStatisticsCount - 1) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 _cur_stat_index = 0;
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1144 } else {
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1145 _cur_stat_index++;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1149
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 void SafepointSynchronize::print_statistics() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 SafepointStats* sstats = _safepoint_stats;
a61af66fc99e Initial load
duke
parents:
diff changeset
1152
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1153 for (int index = 0; index <= _cur_stat_index; index++) {
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1154 if (index % 30 == 0) {
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1155 print_header();
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1156 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 sstats = &_safepoint_stats[index];
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1158 tty->print("%.3f: ", sstats->_time_stamp);
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1159 tty->print("%-26s ["
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 INT32_FORMAT_W(8)INT32_FORMAT_W(11)INT32_FORMAT_W(15)
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1161 " ] ",
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 sstats->_vmop_type == -1 ? "no vm operation" :
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 VM_Operation::name(sstats->_vmop_type),
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 sstats->_nof_total_threads,
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 sstats->_nof_initial_running_threads,
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 sstats->_nof_threads_wait_to_block);
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 // "/ MICROUNITS " is to convert the unit from nanos to millis.
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1168 tty->print(" ["
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1169 INT64_FORMAT_W(6)INT64_FORMAT_W(6)
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1170 INT64_FORMAT_W(6)INT64_FORMAT_W(6)
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1171 INT64_FORMAT_W(6)" ] ",
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 sstats->_time_to_spin / MICROUNITS,
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 sstats->_time_to_wait_to_block / MICROUNITS,
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 sstats->_time_to_sync / MICROUNITS,
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1175 sstats->_time_to_do_cleanups / MICROUNITS,
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1176 sstats->_time_to_exec_vmop / MICROUNITS);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1177
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 if (need_to_track_page_armed_status) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 tty->print(INT32_FORMAT" ", sstats->_page_armed);
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 tty->print_cr(INT32_FORMAT" ", sstats->_nof_threads_hit_page_trap);
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1184
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 // This method will be called when VM exits. It will first call
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 // print_statistics to print out the rest of the sampling. Then
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 // it tries to summarize the sampling.
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 void SafepointSynchronize::print_stat_on_exit() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 if (_safepoint_stats == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1190
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 SafepointStats *spstat = &_safepoint_stats[_cur_stat_index];
a61af66fc99e Initial load
duke
parents:
diff changeset
1192
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 // During VM exit, end_statistics may not get called and in that
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 // case, if the sync time is less than PrintSafepointStatisticsTimeout,
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 // don't print it out.
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 // Approximate the vm op time.
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 _safepoint_stats[_cur_stat_index]._time_to_exec_vmop =
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1198 os::javaTimeNanos() - cleanup_end_time;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1199
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 if ( PrintSafepointStatisticsTimeout < 0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 spstat->_time_to_sync > PrintSafepointStatisticsTimeout * MICROUNITS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 tty->print_cr("");
a61af66fc99e Initial load
duke
parents:
diff changeset
1205
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 // Print out polling page sampling status.
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 if (!need_to_track_page_armed_status) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 if (UseCompilerSafepoints) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 tty->print_cr("Polling page always armed");
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 tty->print_cr("Defer polling page loop count = %d\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 DeferPollingPageLoopCount);
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1215
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 for (int index = 0; index < VM_Operation::VMOp_Terminating; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 if (_safepoint_reasons[index] != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 tty->print_cr("%-26s"UINT64_FORMAT_W(10), VM_Operation::name(index),
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 _safepoint_reasons[index]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1222
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 tty->print_cr(UINT64_FORMAT_W(5)" VM operations coalesced during safepoint",
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 _coalesced_vmop_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 tty->print_cr("Maximum sync time "INT64_FORMAT_W(5)" ms",
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 _max_sync_time / MICROUNITS);
1291
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1227 tty->print_cr("Maximum vm operation time (except for Exit VM operation) "
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1228 INT64_FORMAT_W(5)" ms",
4b0f2f4918ed 6933402: RFE: Improve PrintSafepointStatistics output to track cleanup time
xlu
parents: 1003
diff changeset
1229 _max_vmop_time / MICROUNITS);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1231
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 // ------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 // Non-product code
a61af66fc99e Initial load
duke
parents:
diff changeset
1234
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1236
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 void SafepointSynchronize::print_state() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 if (_state == _not_synchronized) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 tty->print_cr("not synchronized");
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 } else if (_state == _synchronizing || _state == _synchronized) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 tty->print_cr("State: %s", (_state == _synchronizing) ? "synchronizing" :
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 "synchronized");
a61af66fc99e Initial load
duke
parents:
diff changeset
1243
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 for(JavaThread *cur = Threads::first(); cur; cur = cur->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 cur->safepoint_state()->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1249
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 void SafepointSynchronize::safepoint_msg(const char* format, ...) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 if (ShowSafepointMsgs) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 va_list ap;
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 va_start(ap, format);
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 tty->vprint_cr(format, ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 va_end(ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1258
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 #endif // !PRODUCT