Mercurial > hg > truffle
annotate src/share/vm/memory/gcLocker.cpp @ 20543:e7d0505c8a30
8059758: Footprint regressions with JDK-8038423
Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything.
Reviewed-by: jwilhelm, brutisso
author | tschatzl |
---|---|
date | Fri, 10 Oct 2014 15:51:58 +0200 |
parents | ce8f6bb717c9 |
children | 7848fc12602b |
rev | line source |
---|---|
0 | 1 /* |
17937
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
17876
diff
changeset
|
2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
196
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
196
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:
196
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "memory/gcLocker.inline.hpp" | |
27 #include "memory/resourceArea.hpp" | |
28 #include "memory/sharedHeap.hpp" | |
20197
ce8f6bb717c9
8042195: Introduce umbrella header orderAccess.inline.hpp.
goetz
parents:
17937
diff
changeset
|
29 #include "runtime/thread.inline.hpp" |
0 | 30 |
31 volatile jint GC_locker::_jni_lock_count = 0; | |
32 volatile bool GC_locker::_needs_gc = false; | |
33 volatile bool GC_locker::_doing_gc = false; | |
4867
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
34 |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
35 #ifdef ASSERT |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
36 volatile jint GC_locker::_debug_jni_lock_count = 0; |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
37 #endif |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
38 |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
39 |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
40 #ifdef ASSERT |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
41 void GC_locker::verify_critical_count() { |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
42 if (SafepointSynchronize::is_at_safepoint()) { |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
43 assert(!needs_gc() || _debug_jni_lock_count == _jni_lock_count, "must agree"); |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
44 int count = 0; |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
45 // Count the number of threads with critical operations in progress |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
46 for (JavaThread* thr = Threads::first(); thr; thr = thr->next()) { |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
47 if (thr->in_critical()) { |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
48 count++; |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
49 } |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
50 } |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
51 if (_jni_lock_count != count) { |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
52 tty->print_cr("critical counts don't match: %d != %d", _jni_lock_count, count); |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
53 for (JavaThread* thr = Threads::first(); thr; thr = thr->next()) { |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
54 if (thr->in_critical()) { |
17937
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
17876
diff
changeset
|
55 tty->print_cr(INTPTR_FORMAT " in_critical %d", p2i(thr), thr->in_critical()); |
4867
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
56 } |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
57 } |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
58 } |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
59 assert(_jni_lock_count == count, "must be equal"); |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
60 } |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
61 } |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
62 #endif |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
63 |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
64 bool GC_locker::check_active_before_gc() { |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
65 assert(SafepointSynchronize::is_at_safepoint(), "only read at safepoint"); |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
66 if (is_active() && !_needs_gc) { |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
67 verify_critical_count(); |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
68 _needs_gc = true; |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
69 if (PrintJNIGCStalls && PrintGCDetails) { |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
70 ResourceMark rm; // JavaThread::name() allocates to convert to UTF8 |
4944 | 71 gclog_or_tty->print_cr("%.3f: Setting _needs_gc. Thread \"%s\" %d locked.", |
72 gclog_or_tty->time_stamp().seconds(), Thread::current()->name(), _jni_lock_count); | |
4867
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
73 } |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
74 |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
75 } |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
76 return is_active(); |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
77 } |
0 | 78 |
79 void GC_locker::stall_until_clear() { | |
80 assert(!JavaThread::current()->in_critical(), "Would deadlock"); | |
4867
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
81 MutexLocker ml(JNICritical_lock); |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
82 |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
83 if (needs_gc()) { |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
84 if (PrintJNIGCStalls && PrintGCDetails) { |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
85 ResourceMark rm; // JavaThread::name() allocates to convert to UTF8 |
4944 | 86 gclog_or_tty->print_cr("%.3f: Allocation failed. Thread \"%s\" is stalled by JNI critical section, %d locked.", |
87 gclog_or_tty->time_stamp().seconds(), Thread::current()->name(), _jni_lock_count); | |
4867
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
88 } |
139
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
89 } |
4867
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
90 |
0 | 91 // Wait for _needs_gc to be cleared |
4867
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
92 while (needs_gc()) { |
0 | 93 JNICritical_lock->wait(); |
94 } | |
95 } | |
96 | |
4867
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
97 void GC_locker::jni_lock(JavaThread* thread) { |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
98 assert(!thread->in_critical(), "shouldn't currently be in a critical region"); |
0 | 99 MutexLocker mu(JNICritical_lock); |
100 // Block entering threads if we know at least one thread is in a | |
101 // JNI critical region and we need a GC. | |
102 // We check that at least one thread is in a critical region before | |
103 // blocking because blocked threads are woken up by a thread exiting | |
104 // a JNI critical region. | |
17876
9c3dc501b5eb
8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents:
17467
diff
changeset
|
105 while (is_active_and_needs_gc() || _doing_gc) { |
0 | 106 JNICritical_lock->wait(); |
107 } | |
4867
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
108 thread->enter_critical(); |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
109 _jni_lock_count++; |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
110 increment_debug_jni_lock_count(); |
0 | 111 } |
112 | |
4867
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
113 void GC_locker::jni_unlock(JavaThread* thread) { |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
114 assert(thread->in_last_critical(), "should be exiting critical region"); |
0 | 115 MutexLocker mu(JNICritical_lock); |
4867
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
116 _jni_lock_count--; |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
117 decrement_debug_jni_lock_count(); |
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
118 thread->exit_critical(); |
17876
9c3dc501b5eb
8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents:
17467
diff
changeset
|
119 if (needs_gc() && !is_active_internal()) { |
0 | 120 // We're the last thread out. Cause a GC to occur. |
17876
9c3dc501b5eb
8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents:
17467
diff
changeset
|
121 _doing_gc = true; |
9c3dc501b5eb
8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents:
17467
diff
changeset
|
122 { |
9c3dc501b5eb
8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents:
17467
diff
changeset
|
123 // Must give up the lock while at a safepoint |
9c3dc501b5eb
8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents:
17467
diff
changeset
|
124 MutexUnlocker munlock(JNICritical_lock); |
9c3dc501b5eb
8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents:
17467
diff
changeset
|
125 if (PrintJNIGCStalls && PrintGCDetails) { |
9c3dc501b5eb
8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents:
17467
diff
changeset
|
126 ResourceMark rm; // JavaThread::name() allocates to convert to UTF8 |
9c3dc501b5eb
8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents:
17467
diff
changeset
|
127 gclog_or_tty->print_cr("%.3f: Thread \"%s\" is performing GC after exiting critical section, %d locked", |
9c3dc501b5eb
8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents:
17467
diff
changeset
|
128 gclog_or_tty->time_stamp().seconds(), Thread::current()->name(), _jni_lock_count); |
0 | 129 } |
17876
9c3dc501b5eb
8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents:
17467
diff
changeset
|
130 Universe::heap()->collect(GCCause::_gc_locker); |
0 | 131 } |
17876
9c3dc501b5eb
8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents:
17467
diff
changeset
|
132 _doing_gc = false; |
4867
1a2723f7ad8e
7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents:
1972
diff
changeset
|
133 _needs_gc = false; |
0 | 134 JNICritical_lock->notify_all(); |
135 } | |
136 } | |
137 | |
138 // Implementation of No_GC_Verifier | |
139 | |
140 #ifdef ASSERT | |
141 | |
142 No_GC_Verifier::No_GC_Verifier(bool verifygc) { | |
143 _verifygc = verifygc; | |
144 if (_verifygc) { | |
145 CollectedHeap* h = Universe::heap(); | |
146 assert(!h->is_gc_active(), "GC active during No_GC_Verifier"); | |
147 _old_invocations = h->total_collections(); | |
148 } | |
149 } | |
150 | |
151 | |
152 No_GC_Verifier::~No_GC_Verifier() { | |
153 if (_verifygc) { | |
154 CollectedHeap* h = Universe::heap(); | |
155 assert(!h->is_gc_active(), "GC active during No_GC_Verifier"); | |
156 if (_old_invocations != h->total_collections()) { | |
157 fatal("collection in a No_GC_Verifier secured function"); | |
158 } | |
159 } | |
160 } | |
161 | |
162 Pause_No_GC_Verifier::Pause_No_GC_Verifier(No_GC_Verifier * ngcv) { | |
163 _ngcv = ngcv; | |
164 if (_ngcv->_verifygc) { | |
165 // if we were verifying, then make sure that nothing is | |
166 // wrong before we "pause" verification | |
167 CollectedHeap* h = Universe::heap(); | |
168 assert(!h->is_gc_active(), "GC active during No_GC_Verifier"); | |
169 if (_ngcv->_old_invocations != h->total_collections()) { | |
170 fatal("collection in a No_GC_Verifier secured function"); | |
171 } | |
172 } | |
173 } | |
174 | |
175 | |
176 Pause_No_GC_Verifier::~Pause_No_GC_Verifier() { | |
177 if (_ngcv->_verifygc) { | |
178 // if we were verifying before, then reenable verification | |
179 CollectedHeap* h = Universe::heap(); | |
180 assert(!h->is_gc_active(), "GC active during No_GC_Verifier"); | |
181 _ngcv->_old_invocations = h->total_collections(); | |
182 } | |
183 } | |
184 | |
185 | |
186 // JRT_LEAF rules: | |
187 // A JRT_LEAF method may not interfere with safepointing by | |
188 // 1) acquiring or blocking on a Mutex or JavaLock - checked | |
189 // 2) allocating heap memory - checked | |
190 // 3) executing a VM operation - checked | |
191 // 4) executing a system call (including malloc) that could block or grab a lock | |
192 // 5) invoking GC | |
193 // 6) reaching a safepoint | |
194 // 7) running too long | |
195 // Nor may any method it calls. | |
196 JRT_Leaf_Verifier::JRT_Leaf_Verifier() | |
197 : No_Safepoint_Verifier(true, JRT_Leaf_Verifier::should_verify_GC()) | |
198 { | |
199 } | |
200 | |
201 JRT_Leaf_Verifier::~JRT_Leaf_Verifier() | |
202 { | |
203 } | |
204 | |
205 bool JRT_Leaf_Verifier::should_verify_GC() { | |
206 switch (JavaThread::current()->thread_state()) { | |
207 case _thread_in_Java: | |
208 // is in a leaf routine, there must be no safepoint. | |
209 return true; | |
210 case _thread_in_native: | |
211 // A native thread is not subject to safepoints. | |
212 // Even while it is in a leaf routine, GC is ok | |
213 return false; | |
214 default: | |
215 // Leaf routines cannot be called from other contexts. | |
216 ShouldNotReachHere(); | |
217 return false; | |
218 } | |
219 } | |
220 #endif |