Mercurial > hg > graal-jvmci-8
annotate src/share/vm/runtime/virtualspace.cpp @ 23007:3c8b53552a43
4505697: nsk/jdi/ExceptionEvent/_itself_/exevent006 and exevent008 tests fail with InvocationTargetException
Reviewed-by: dcubed, dholmes, sspitsyn
author | jbachorik |
---|---|
date | Mon, 24 Feb 2014 10:28:22 +0100 |
parents | 30e04eba9e29 |
children | dd9cc155639c |
rev | line source |
---|---|
0 | 1 /* |
17937
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
14422
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:
844
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
844
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:
844
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "oops/markOop.hpp" | |
27 #include "oops/oop.inline.hpp" | |
28 #include "runtime/virtualspace.hpp" | |
6197 | 29 #include "services/memTracker.hpp" |
1972 | 30 #ifdef TARGET_OS_FAMILY_linux |
31 # include "os_linux.inline.hpp" | |
32 #endif | |
33 #ifdef TARGET_OS_FAMILY_solaris | |
34 # include "os_solaris.inline.hpp" | |
35 #endif | |
36 #ifdef TARGET_OS_FAMILY_windows | |
37 # include "os_windows.inline.hpp" | |
38 #endif | |
14411 | 39 #ifdef TARGET_OS_FAMILY_aix |
40 # include "os_aix.inline.hpp" | |
41 #endif | |
3960 | 42 #ifdef TARGET_OS_FAMILY_bsd |
43 # include "os_bsd.inline.hpp" | |
44 #endif | |
0 | 45 |
17937
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
14422
diff
changeset
|
46 PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC |
0 | 47 |
48 // ReservedSpace | |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
49 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
50 // Dummy constructor |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
51 ReservedSpace::ReservedSpace() : _base(NULL), _size(0), _noaccess_prefix(0), |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
52 _alignment(0), _special(false), _executable(false) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
53 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
54 |
22978
30e04eba9e29
8077255: TracePageSizes output reports wrong page size on Windows with G1
tschatzl
parents:
22977
diff
changeset
|
55 ReservedSpace::ReservedSpace(size_t size, size_t preferred_page_size) { |
30e04eba9e29
8077255: TracePageSizes output reports wrong page size on Windows with G1
tschatzl
parents:
22977
diff
changeset
|
56 bool has_preferred_page_size = preferred_page_size != 0; |
22976 | 57 // Want to use large pages where possible and pad with small pages. |
22978
30e04eba9e29
8077255: TracePageSizes output reports wrong page size on Windows with G1
tschatzl
parents:
22977
diff
changeset
|
58 size_t page_size = has_preferred_page_size ? preferred_page_size : os::page_size_for_region_unaligned(size, 1); |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
59 bool large_pages = page_size != (size_t)os::vm_page_size(); |
22977
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22976
diff
changeset
|
60 size_t alignment; |
22978
30e04eba9e29
8077255: TracePageSizes output reports wrong page size on Windows with G1
tschatzl
parents:
22977
diff
changeset
|
61 if (large_pages && has_preferred_page_size) { |
22977
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22976
diff
changeset
|
62 alignment = MAX2(page_size, (size_t)os::vm_allocation_granularity()); |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22976
diff
changeset
|
63 // ReservedSpace initialization requires size to be aligned to the given |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22976
diff
changeset
|
64 // alignment. Align the size up. |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22976
diff
changeset
|
65 size = align_size_up(size, alignment); |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22976
diff
changeset
|
66 } else { |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22976
diff
changeset
|
67 // Don't force the alignment to be large page aligned, |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22976
diff
changeset
|
68 // since that will waste memory. |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22976
diff
changeset
|
69 alignment = os::vm_allocation_granularity(); |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22976
diff
changeset
|
70 } |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
71 initialize(size, alignment, large_pages, NULL, 0, false); |
0 | 72 } |
73 | |
74 ReservedSpace::ReservedSpace(size_t size, size_t alignment, | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
75 bool large, |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
76 char* requested_address, |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
77 const size_t noaccess_prefix) { |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
78 initialize(size+noaccess_prefix, alignment, large, requested_address, |
656 | 79 noaccess_prefix, false); |
80 } | |
81 | |
82 ReservedSpace::ReservedSpace(size_t size, size_t alignment, | |
83 bool large, | |
84 bool executable) { | |
85 initialize(size, alignment, large, NULL, 0, executable); | |
0 | 86 } |
87 | |
1618 | 88 // Helper method. |
89 static bool failed_to_reserve_as_requested(char* base, char* requested_address, | |
90 const size_t size, bool special) | |
91 { | |
92 if (base == requested_address || requested_address == NULL) | |
93 return false; // did not fail | |
94 | |
95 if (base != NULL) { | |
96 // Different reserve address may be acceptable in other cases | |
97 // but for compressed oops heap should be at requested address. | |
98 assert(UseCompressedOops, "currently requested address used only for compressed oops"); | |
99 if (PrintCompressedOopsMode) { | |
100 tty->cr(); | |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
101 tty->print_cr("Reserved memory not at requested address: " PTR_FORMAT " vs " PTR_FORMAT, base, requested_address); |
1618 | 102 } |
103 // OS ignored requested address. Try different address. | |
104 if (special) { | |
105 if (!os::release_memory_special(base, size)) { | |
106 fatal("os::release_memory_special failed"); | |
107 } | |
108 } else { | |
109 if (!os::release_memory(base, size)) { | |
110 fatal("os::release_memory failed"); | |
111 } | |
112 } | |
113 } | |
114 return true; | |
115 } | |
116 | |
0 | 117 void ReservedSpace::initialize(size_t size, size_t alignment, bool large, |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
118 char* requested_address, |
656 | 119 const size_t noaccess_prefix, |
120 bool executable) { | |
0 | 121 const size_t granularity = os::vm_allocation_granularity(); |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
122 assert((size & (granularity - 1)) == 0, |
0 | 123 "size not aligned to os::vm_allocation_granularity()"); |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
124 assert((alignment & (granularity - 1)) == 0, |
0 | 125 "alignment not aligned to os::vm_allocation_granularity()"); |
126 assert(alignment == 0 || is_power_of_2((intptr_t)alignment), | |
127 "not a power of 2"); | |
128 | |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
129 alignment = MAX2(alignment, (size_t)os::vm_page_size()); |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
130 |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
131 // Assert that if noaccess_prefix is used, it is the same as alignment. |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
132 assert(noaccess_prefix == 0 || |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
133 noaccess_prefix == alignment, "noaccess prefix wrong"); |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
134 |
0 | 135 _base = NULL; |
136 _size = 0; | |
137 _special = false; | |
656 | 138 _executable = executable; |
0 | 139 _alignment = 0; |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
140 _noaccess_prefix = 0; |
0 | 141 if (size == 0) { |
142 return; | |
143 } | |
144 | |
145 // If OS doesn't support demand paging for large page memory, we need | |
146 // to use reserve_memory_special() to reserve and pin the entire region. | |
147 bool special = large && !os::can_commit_large_page_memory(); | |
148 char* base = NULL; | |
149 | |
1618 | 150 if (requested_address != 0) { |
151 requested_address -= noaccess_prefix; // adjust requested address | |
152 assert(requested_address != NULL, "huge noaccess prefix?"); | |
153 } | |
154 | |
0 | 155 if (special) { |
156 | |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
157 base = os::reserve_memory_special(size, alignment, requested_address, executable); |
0 | 158 |
159 if (base != NULL) { | |
1618 | 160 if (failed_to_reserve_as_requested(base, requested_address, size, true)) { |
161 // OS ignored requested address. Try different address. | |
162 return; | |
163 } | |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
164 // Check alignment constraints. |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
165 assert((uintptr_t) base % alignment == 0, |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
166 err_msg("Large pages returned a non-aligned address, base: " |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
167 PTR_FORMAT " alignment: " PTR_FORMAT, |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
168 base, (void*)(uintptr_t)alignment)); |
0 | 169 _special = true; |
170 } else { | |
171 // failed; try to reserve regular memory below | |
1618 | 172 if (UseLargePages && (!FLAG_IS_DEFAULT(UseLargePages) || |
173 !FLAG_IS_DEFAULT(LargePageSizeInBytes))) { | |
174 if (PrintCompressedOopsMode) { | |
175 tty->cr(); | |
176 tty->print_cr("Reserve regular memory without large pages."); | |
177 } | |
178 } | |
0 | 179 } |
180 } | |
181 | |
182 if (base == NULL) { | |
183 // Optimistically assume that the OSes returns an aligned base pointer. | |
184 // When reserving a large address range, most OSes seem to align to at | |
185 // least 64K. | |
186 | |
187 // If the memory was requested at a particular address, use | |
188 // os::attempt_reserve_memory_at() to avoid over mapping something | |
189 // important. If available space is not detected, return NULL. | |
190 | |
191 if (requested_address != 0) { | |
1618 | 192 base = os::attempt_reserve_memory_at(size, requested_address); |
193 if (failed_to_reserve_as_requested(base, requested_address, size, false)) { | |
194 // OS ignored requested address. Try different address. | |
195 base = NULL; | |
196 } | |
0 | 197 } else { |
198 base = os::reserve_memory(size, NULL, alignment); | |
199 } | |
200 | |
201 if (base == NULL) return; | |
202 | |
203 // Check alignment constraints | |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
204 if ((((size_t)base + noaccess_prefix) & (alignment - 1)) != 0) { |
0 | 205 // Base not aligned, retry |
206 if (!os::release_memory(base, size)) fatal("os::release_memory failed"); | |
7433
730cc4ddd550
7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents:
6725
diff
changeset
|
207 // Make sure that size is aligned |
0 | 208 size = align_size_up(size, alignment); |
7433
730cc4ddd550
7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents:
6725
diff
changeset
|
209 base = os::reserve_memory_aligned(size, alignment); |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
210 |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
211 if (requested_address != 0 && |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
212 failed_to_reserve_as_requested(base, requested_address, size, false)) { |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
213 // As a result of the alignment constraints, the allocated base differs |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
214 // from the requested address. Return back to the caller who can |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
215 // take remedial action (like try again without a requested address). |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
216 assert(_base == NULL, "should be"); |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
217 return; |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
218 } |
0 | 219 } |
220 } | |
221 // Done | |
222 _base = base; | |
223 _size = size; | |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
224 _alignment = alignment; |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
225 _noaccess_prefix = noaccess_prefix; |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
226 |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
227 // Assert that if noaccess_prefix is used, it is the same as alignment. |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
228 assert(noaccess_prefix == 0 || |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
229 noaccess_prefix == _alignment, "noaccess prefix wrong"); |
0 | 230 |
231 assert(markOopDesc::encode_pointer_as_mark(_base)->decode_pointer() == _base, | |
232 "area must be distinguisable from marks for mark-sweep"); | |
233 assert(markOopDesc::encode_pointer_as_mark(&_base[size])->decode_pointer() == &_base[size], | |
234 "area must be distinguisable from marks for mark-sweep"); | |
235 } | |
236 | |
237 | |
238 ReservedSpace::ReservedSpace(char* base, size_t size, size_t alignment, | |
656 | 239 bool special, bool executable) { |
0 | 240 assert((size % os::vm_allocation_granularity()) == 0, |
241 "size not allocation aligned"); | |
242 _base = base; | |
243 _size = size; | |
244 _alignment = alignment; | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
245 _noaccess_prefix = 0; |
0 | 246 _special = special; |
656 | 247 _executable = executable; |
0 | 248 } |
249 | |
250 | |
251 ReservedSpace ReservedSpace::first_part(size_t partition_size, size_t alignment, | |
252 bool split, bool realloc) { | |
253 assert(partition_size <= size(), "partition failed"); | |
254 if (split) { | |
656 | 255 os::split_reserved_memory(base(), size(), partition_size, realloc); |
0 | 256 } |
656 | 257 ReservedSpace result(base(), partition_size, alignment, special(), |
258 executable()); | |
0 | 259 return result; |
260 } | |
261 | |
262 | |
263 ReservedSpace | |
264 ReservedSpace::last_part(size_t partition_size, size_t alignment) { | |
265 assert(partition_size <= size(), "partition failed"); | |
266 ReservedSpace result(base() + partition_size, size() - partition_size, | |
656 | 267 alignment, special(), executable()); |
0 | 268 return result; |
269 } | |
270 | |
271 | |
272 size_t ReservedSpace::page_align_size_up(size_t size) { | |
273 return align_size_up(size, os::vm_page_size()); | |
274 } | |
275 | |
276 | |
277 size_t ReservedSpace::page_align_size_down(size_t size) { | |
278 return align_size_down(size, os::vm_page_size()); | |
279 } | |
280 | |
281 | |
282 size_t ReservedSpace::allocation_align_size_up(size_t size) { | |
283 return align_size_up(size, os::vm_allocation_granularity()); | |
284 } | |
285 | |
286 | |
287 size_t ReservedSpace::allocation_align_size_down(size_t size) { | |
288 return align_size_down(size, os::vm_allocation_granularity()); | |
289 } | |
290 | |
291 | |
292 void ReservedSpace::release() { | |
293 if (is_reserved()) { | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
294 char *real_base = _base - _noaccess_prefix; |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
295 const size_t real_size = _size + _noaccess_prefix; |
0 | 296 if (special()) { |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
297 os::release_memory_special(real_base, real_size); |
0 | 298 } else{ |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
299 os::release_memory(real_base, real_size); |
0 | 300 } |
301 _base = NULL; | |
302 _size = 0; | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
303 _noaccess_prefix = 0; |
0 | 304 _special = false; |
656 | 305 _executable = false; |
0 | 306 } |
307 } | |
308 | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
309 void ReservedSpace::protect_noaccess_prefix(const size_t size) { |
1618 | 310 assert( (_noaccess_prefix != 0) == (UseCompressedOops && _base != NULL && |
4934
7df3125953cb
7146354: Re-enable Compressed OOPs after 7118647 is resolved
coleenp
parents:
3960
diff
changeset
|
311 (Universe::narrow_oop_base() != NULL) && |
1618 | 312 Universe::narrow_oop_use_implicit_null_checks()), |
313 "noaccess_prefix should be used only with non zero based compressed oops"); | |
314 | |
315 // If there is no noaccess prefix, return. | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
316 if (_noaccess_prefix == 0) return; |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
317 |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
318 assert(_noaccess_prefix >= (size_t)os::vm_page_size(), |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
319 "must be at least page size big"); |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
320 |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
321 // Protect memory at the base of the allocated region. |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
322 // If special, the page was committed (only matters on windows) |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
323 if (!os::protect_memory(_base, _noaccess_prefix, os::MEM_PROT_NONE, |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
324 _special)) { |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
325 fatal("cannot protect protection page"); |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
326 } |
1618 | 327 if (PrintCompressedOopsMode) { |
328 tty->cr(); | |
329 tty->print_cr("Protected page at the reserved heap base: " PTR_FORMAT " / " INTX_FORMAT " bytes", _base, _noaccess_prefix); | |
330 } | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
331 |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
332 _base += _noaccess_prefix; |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
333 _size -= _noaccess_prefix; |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
334 assert((size == _size) && ((uintptr_t)_base % _alignment == 0), |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
335 "must be exactly of required size and alignment"); |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
336 } |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
337 |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
338 ReservedHeapSpace::ReservedHeapSpace(size_t size, size_t alignment, |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
339 bool large, char* requested_address) : |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
340 ReservedSpace(size, alignment, large, |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
341 requested_address, |
642
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
380
diff
changeset
|
342 (UseCompressedOops && (Universe::narrow_oop_base() != NULL) && |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
380
diff
changeset
|
343 Universe::narrow_oop_use_implicit_null_checks()) ? |
325
93befa083681
6741004: UseLargePages + UseCompressedOops breaks implicit null checking guard page
coleenp
parents:
237
diff
changeset
|
344 lcm(os::vm_page_size(), alignment) : 0) { |
6197 | 345 if (base() > 0) { |
346 MemTracker::record_virtual_memory_type((address)base(), mtJavaHeap); | |
347 } | |
348 | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
349 // Only reserved space for the java heap should have a noaccess_prefix |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
350 // if using compressed oops. |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
351 protect_noaccess_prefix(size); |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
352 } |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
353 |
656 | 354 // Reserve space for code segment. Same as Java heap only we mark this as |
355 // executable. | |
356 ReservedCodeSpace::ReservedCodeSpace(size_t r_size, | |
357 size_t rs_align, | |
358 bool large) : | |
359 ReservedSpace(r_size, rs_align, large, /*executable*/ true) { | |
6197 | 360 MemTracker::record_virtual_memory_type((address)base(), mtCode); |
656 | 361 } |
362 | |
0 | 363 // VirtualSpace |
364 | |
365 VirtualSpace::VirtualSpace() { | |
366 _low_boundary = NULL; | |
367 _high_boundary = NULL; | |
368 _low = NULL; | |
369 _high = NULL; | |
370 _lower_high = NULL; | |
371 _middle_high = NULL; | |
372 _upper_high = NULL; | |
373 _lower_high_boundary = NULL; | |
374 _middle_high_boundary = NULL; | |
375 _upper_high_boundary = NULL; | |
376 _lower_alignment = 0; | |
377 _middle_alignment = 0; | |
378 _upper_alignment = 0; | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
379 _special = false; |
656 | 380 _executable = false; |
0 | 381 } |
382 | |
383 | |
384 bool VirtualSpace::initialize(ReservedSpace rs, size_t committed_size) { | |
22976 | 385 const size_t max_commit_granularity = os::page_size_for_region_unaligned(rs.size(), 1); |
12834
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
386 return initialize_with_granularity(rs, committed_size, max_commit_granularity); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
387 } |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
388 |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
389 bool VirtualSpace::initialize_with_granularity(ReservedSpace rs, size_t committed_size, size_t max_commit_granularity) { |
0 | 390 if(!rs.is_reserved()) return false; // allocation failed. |
391 assert(_low_boundary == NULL, "VirtualSpace already initialized"); | |
12834
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
392 assert(max_commit_granularity > 0, "Granularity must be non-zero."); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
393 |
0 | 394 _low_boundary = rs.base(); |
395 _high_boundary = low_boundary() + rs.size(); | |
396 | |
397 _low = low_boundary(); | |
398 _high = low(); | |
399 | |
400 _special = rs.special(); | |
656 | 401 _executable = rs.executable(); |
0 | 402 |
403 // When a VirtualSpace begins life at a large size, make all future expansion | |
404 // and shrinking occur aligned to a granularity of large pages. This avoids | |
405 // fragmentation of physical addresses that inhibits the use of large pages | |
406 // by the OS virtual memory system. Empirically, we see that with a 4MB | |
407 // page size, the only spaces that get handled this way are codecache and | |
408 // the heap itself, both of which provide a substantial performance | |
409 // boost in many benchmarks when covered by large pages. | |
410 // | |
411 // No attempt is made to force large page alignment at the very top and | |
412 // bottom of the space if they are not aligned so already. | |
413 _lower_alignment = os::vm_page_size(); | |
12834
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
414 _middle_alignment = max_commit_granularity; |
0 | 415 _upper_alignment = os::vm_page_size(); |
416 | |
417 // End of each region | |
418 _lower_high_boundary = (char*) round_to((intptr_t) low_boundary(), middle_alignment()); | |
419 _middle_high_boundary = (char*) round_down((intptr_t) high_boundary(), middle_alignment()); | |
420 _upper_high_boundary = high_boundary(); | |
421 | |
422 // High address of each region | |
423 _lower_high = low_boundary(); | |
424 _middle_high = lower_high_boundary(); | |
425 _upper_high = middle_high_boundary(); | |
426 | |
427 // commit to initial size | |
428 if (committed_size > 0) { | |
429 if (!expand_by(committed_size)) { | |
430 return false; | |
431 } | |
432 } | |
433 return true; | |
434 } | |
435 | |
436 | |
437 VirtualSpace::~VirtualSpace() { | |
438 release(); | |
439 } | |
440 | |
441 | |
442 void VirtualSpace::release() { | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
443 // This does not release memory it never reserved. |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
444 // Caller must release via rs.release(); |
0 | 445 _low_boundary = NULL; |
446 _high_boundary = NULL; | |
447 _low = NULL; | |
448 _high = NULL; | |
449 _lower_high = NULL; | |
450 _middle_high = NULL; | |
451 _upper_high = NULL; | |
452 _lower_high_boundary = NULL; | |
453 _middle_high_boundary = NULL; | |
454 _upper_high_boundary = NULL; | |
455 _lower_alignment = 0; | |
456 _middle_alignment = 0; | |
457 _upper_alignment = 0; | |
458 _special = false; | |
656 | 459 _executable = false; |
0 | 460 } |
461 | |
462 | |
463 size_t VirtualSpace::committed_size() const { | |
464 return pointer_delta(high(), low(), sizeof(char)); | |
465 } | |
466 | |
467 | |
468 size_t VirtualSpace::reserved_size() const { | |
469 return pointer_delta(high_boundary(), low_boundary(), sizeof(char)); | |
470 } | |
471 | |
472 | |
473 size_t VirtualSpace::uncommitted_size() const { | |
474 return reserved_size() - committed_size(); | |
475 } | |
476 | |
12236
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
477 size_t VirtualSpace::actual_committed_size() const { |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
478 // Special VirtualSpaces commit all reserved space up front. |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
479 if (special()) { |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
480 return reserved_size(); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
481 } |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
482 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
483 size_t committed_low = pointer_delta(_lower_high, _low_boundary, sizeof(char)); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
484 size_t committed_middle = pointer_delta(_middle_high, _lower_high_boundary, sizeof(char)); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
485 size_t committed_high = pointer_delta(_upper_high, _middle_high_boundary, sizeof(char)); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
486 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
487 #ifdef ASSERT |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
488 size_t lower = pointer_delta(_lower_high_boundary, _low_boundary, sizeof(char)); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
489 size_t middle = pointer_delta(_middle_high_boundary, _lower_high_boundary, sizeof(char)); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
490 size_t upper = pointer_delta(_upper_high_boundary, _middle_high_boundary, sizeof(char)); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
491 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
492 if (committed_high > 0) { |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
493 assert(committed_low == lower, "Must be"); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
494 assert(committed_middle == middle, "Must be"); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
495 } |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
496 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
497 if (committed_middle > 0) { |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
498 assert(committed_low == lower, "Must be"); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
499 } |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
500 if (committed_middle < middle) { |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
501 assert(committed_high == 0, "Must be"); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
502 } |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
503 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
504 if (committed_low < lower) { |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
505 assert(committed_high == 0, "Must be"); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
506 assert(committed_middle == 0, "Must be"); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
507 } |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
508 #endif |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
509 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
510 return committed_low + committed_middle + committed_high; |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
511 } |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
512 |
0 | 513 |
514 bool VirtualSpace::contains(const void* p) const { | |
515 return low() <= (const char*) p && (const char*) p < high(); | |
516 } | |
517 | |
518 /* | |
519 First we need to determine if a particular virtual space is using large | |
520 pages. This is done at the initialize function and only virtual spaces | |
521 that are larger than LargePageSizeInBytes use large pages. Once we | |
522 have determined this, all expand_by and shrink_by calls must grow and | |
523 shrink by large page size chunks. If a particular request | |
524 is within the current large page, the call to commit and uncommit memory | |
525 can be ignored. In the case that the low and high boundaries of this | |
526 space is not large page aligned, the pages leading to the first large | |
527 page address and the pages after the last large page address must be | |
528 allocated with default pages. | |
529 */ | |
530 bool VirtualSpace::expand_by(size_t bytes, bool pre_touch) { | |
531 if (uncommitted_size() < bytes) return false; | |
532 | |
533 if (special()) { | |
534 // don't commit memory if the entire space is pinned in memory | |
535 _high += bytes; | |
536 return true; | |
537 } | |
538 | |
539 char* previous_high = high(); | |
540 char* unaligned_new_high = high() + bytes; | |
541 assert(unaligned_new_high <= high_boundary(), | |
542 "cannot expand by more than upper boundary"); | |
543 | |
544 // Calculate where the new high for each of the regions should be. If | |
545 // the low_boundary() and high_boundary() are LargePageSizeInBytes aligned | |
546 // then the unaligned lower and upper new highs would be the | |
547 // lower_high() and upper_high() respectively. | |
548 char* unaligned_lower_new_high = | |
549 MIN2(unaligned_new_high, lower_high_boundary()); | |
550 char* unaligned_middle_new_high = | |
551 MIN2(unaligned_new_high, middle_high_boundary()); | |
552 char* unaligned_upper_new_high = | |
553 MIN2(unaligned_new_high, upper_high_boundary()); | |
554 | |
555 // Align the new highs based on the regions alignment. lower and upper | |
556 // alignment will always be default page size. middle alignment will be | |
557 // LargePageSizeInBytes if the actual size of the virtual space is in | |
558 // fact larger than LargePageSizeInBytes. | |
559 char* aligned_lower_new_high = | |
560 (char*) round_to((intptr_t) unaligned_lower_new_high, lower_alignment()); | |
561 char* aligned_middle_new_high = | |
562 (char*) round_to((intptr_t) unaligned_middle_new_high, middle_alignment()); | |
563 char* aligned_upper_new_high = | |
564 (char*) round_to((intptr_t) unaligned_upper_new_high, upper_alignment()); | |
565 | |
566 // Determine which regions need to grow in this expand_by call. | |
567 // If you are growing in the lower region, high() must be in that | |
568 // region so calcuate the size based on high(). For the middle and | |
569 // upper regions, determine the starting point of growth based on the | |
570 // location of high(). By getting the MAX of the region's low address | |
571 // (or the prevoius region's high address) and high(), we can tell if it | |
572 // is an intra or inter region growth. | |
573 size_t lower_needs = 0; | |
574 if (aligned_lower_new_high > lower_high()) { | |
575 lower_needs = | |
576 pointer_delta(aligned_lower_new_high, lower_high(), sizeof(char)); | |
577 } | |
578 size_t middle_needs = 0; | |
579 if (aligned_middle_new_high > middle_high()) { | |
580 middle_needs = | |
581 pointer_delta(aligned_middle_new_high, middle_high(), sizeof(char)); | |
582 } | |
583 size_t upper_needs = 0; | |
584 if (aligned_upper_new_high > upper_high()) { | |
585 upper_needs = | |
586 pointer_delta(aligned_upper_new_high, upper_high(), sizeof(char)); | |
587 } | |
588 | |
589 // Check contiguity. | |
590 assert(low_boundary() <= lower_high() && | |
591 lower_high() <= lower_high_boundary(), | |
592 "high address must be contained within the region"); | |
593 assert(lower_high_boundary() <= middle_high() && | |
594 middle_high() <= middle_high_boundary(), | |
595 "high address must be contained within the region"); | |
596 assert(middle_high_boundary() <= upper_high() && | |
597 upper_high() <= upper_high_boundary(), | |
598 "high address must be contained within the region"); | |
599 | |
600 // Commit regions | |
601 if (lower_needs > 0) { | |
602 assert(low_boundary() <= lower_high() && | |
603 lower_high() + lower_needs <= lower_high_boundary(), | |
604 "must not expand beyond region"); | |
656 | 605 if (!os::commit_memory(lower_high(), lower_needs, _executable)) { |
10969
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
606 debug_only(warning("INFO: os::commit_memory(" PTR_FORMAT |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
607 ", lower_needs=" SIZE_FORMAT ", %d) failed", |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
608 lower_high(), lower_needs, _executable);) |
0 | 609 return false; |
610 } else { | |
611 _lower_high += lower_needs; | |
10969
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
612 } |
0 | 613 } |
614 if (middle_needs > 0) { | |
615 assert(lower_high_boundary() <= middle_high() && | |
616 middle_high() + middle_needs <= middle_high_boundary(), | |
617 "must not expand beyond region"); | |
656 | 618 if (!os::commit_memory(middle_high(), middle_needs, middle_alignment(), |
619 _executable)) { | |
10969
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
620 debug_only(warning("INFO: os::commit_memory(" PTR_FORMAT |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
621 ", middle_needs=" SIZE_FORMAT ", " SIZE_FORMAT |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
622 ", %d) failed", middle_high(), middle_needs, |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
623 middle_alignment(), _executable);) |
0 | 624 return false; |
625 } | |
626 _middle_high += middle_needs; | |
627 } | |
628 if (upper_needs > 0) { | |
629 assert(middle_high_boundary() <= upper_high() && | |
630 upper_high() + upper_needs <= upper_high_boundary(), | |
631 "must not expand beyond region"); | |
656 | 632 if (!os::commit_memory(upper_high(), upper_needs, _executable)) { |
10969
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
633 debug_only(warning("INFO: os::commit_memory(" PTR_FORMAT |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
634 ", upper_needs=" SIZE_FORMAT ", %d) failed", |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
635 upper_high(), upper_needs, _executable);) |
0 | 636 return false; |
637 } else { | |
638 _upper_high += upper_needs; | |
639 } | |
640 } | |
641 | |
642 if (pre_touch || AlwaysPreTouch) { | |
22973 | 643 os::pretouch_memory(previous_high, unaligned_new_high); |
0 | 644 } |
645 | |
646 _high += bytes; | |
647 return true; | |
648 } | |
649 | |
650 // A page is uncommitted if the contents of the entire page is deemed unusable. | |
651 // Continue to decrement the high() pointer until it reaches a page boundary | |
652 // in which case that particular page can now be uncommitted. | |
653 void VirtualSpace::shrink_by(size_t size) { | |
654 if (committed_size() < size) | |
655 fatal("Cannot shrink virtual space to negative size"); | |
656 | |
657 if (special()) { | |
658 // don't uncommit if the entire space is pinned in memory | |
659 _high -= size; | |
660 return; | |
661 } | |
662 | |
663 char* unaligned_new_high = high() - size; | |
664 assert(unaligned_new_high >= low_boundary(), "cannot shrink past lower boundary"); | |
665 | |
666 // Calculate new unaligned address | |
667 char* unaligned_upper_new_high = | |
668 MAX2(unaligned_new_high, middle_high_boundary()); | |
669 char* unaligned_middle_new_high = | |
670 MAX2(unaligned_new_high, lower_high_boundary()); | |
671 char* unaligned_lower_new_high = | |
672 MAX2(unaligned_new_high, low_boundary()); | |
673 | |
674 // Align address to region's alignment | |
675 char* aligned_upper_new_high = | |
676 (char*) round_to((intptr_t) unaligned_upper_new_high, upper_alignment()); | |
677 char* aligned_middle_new_high = | |
678 (char*) round_to((intptr_t) unaligned_middle_new_high, middle_alignment()); | |
679 char* aligned_lower_new_high = | |
680 (char*) round_to((intptr_t) unaligned_lower_new_high, lower_alignment()); | |
681 | |
682 // Determine which regions need to shrink | |
683 size_t upper_needs = 0; | |
684 if (aligned_upper_new_high < upper_high()) { | |
685 upper_needs = | |
686 pointer_delta(upper_high(), aligned_upper_new_high, sizeof(char)); | |
687 } | |
688 size_t middle_needs = 0; | |
689 if (aligned_middle_new_high < middle_high()) { | |
690 middle_needs = | |
691 pointer_delta(middle_high(), aligned_middle_new_high, sizeof(char)); | |
692 } | |
693 size_t lower_needs = 0; | |
694 if (aligned_lower_new_high < lower_high()) { | |
695 lower_needs = | |
696 pointer_delta(lower_high(), aligned_lower_new_high, sizeof(char)); | |
697 } | |
698 | |
699 // Check contiguity. | |
700 assert(middle_high_boundary() <= upper_high() && | |
701 upper_high() <= upper_high_boundary(), | |
702 "high address must be contained within the region"); | |
703 assert(lower_high_boundary() <= middle_high() && | |
704 middle_high() <= middle_high_boundary(), | |
705 "high address must be contained within the region"); | |
706 assert(low_boundary() <= lower_high() && | |
707 lower_high() <= lower_high_boundary(), | |
708 "high address must be contained within the region"); | |
709 | |
710 // Uncommit | |
711 if (upper_needs > 0) { | |
712 assert(middle_high_boundary() <= aligned_upper_new_high && | |
713 aligned_upper_new_high + upper_needs <= upper_high_boundary(), | |
714 "must not shrink beyond region"); | |
715 if (!os::uncommit_memory(aligned_upper_new_high, upper_needs)) { | |
716 debug_only(warning("os::uncommit_memory failed")); | |
717 return; | |
718 } else { | |
719 _upper_high -= upper_needs; | |
720 } | |
721 } | |
722 if (middle_needs > 0) { | |
723 assert(lower_high_boundary() <= aligned_middle_new_high && | |
724 aligned_middle_new_high + middle_needs <= middle_high_boundary(), | |
725 "must not shrink beyond region"); | |
726 if (!os::uncommit_memory(aligned_middle_new_high, middle_needs)) { | |
727 debug_only(warning("os::uncommit_memory failed")); | |
728 return; | |
729 } else { | |
730 _middle_high -= middle_needs; | |
731 } | |
732 } | |
733 if (lower_needs > 0) { | |
734 assert(low_boundary() <= aligned_lower_new_high && | |
735 aligned_lower_new_high + lower_needs <= lower_high_boundary(), | |
736 "must not shrink beyond region"); | |
737 if (!os::uncommit_memory(aligned_lower_new_high, lower_needs)) { | |
738 debug_only(warning("os::uncommit_memory failed")); | |
739 return; | |
740 } else { | |
741 _lower_high -= lower_needs; | |
742 } | |
743 } | |
744 | |
745 _high -= size; | |
746 } | |
747 | |
748 #ifndef PRODUCT | |
749 void VirtualSpace::check_for_contiguity() { | |
750 // Check contiguity. | |
751 assert(low_boundary() <= lower_high() && | |
752 lower_high() <= lower_high_boundary(), | |
753 "high address must be contained within the region"); | |
754 assert(lower_high_boundary() <= middle_high() && | |
755 middle_high() <= middle_high_boundary(), | |
756 "high address must be contained within the region"); | |
757 assert(middle_high_boundary() <= upper_high() && | |
758 upper_high() <= upper_high_boundary(), | |
759 "high address must be contained within the region"); | |
760 assert(low() >= low_boundary(), "low"); | |
761 assert(low_boundary() <= lower_high_boundary(), "lower high boundary"); | |
762 assert(upper_high_boundary() <= high_boundary(), "upper high boundary"); | |
763 assert(high() <= upper_high(), "upper high"); | |
764 } | |
765 | |
12240
8c5e6482cbfc
8024752: Log TraceMetadata* output to gclog_or_tty instead of tty
stefank
parents:
12236
diff
changeset
|
766 void VirtualSpace::print_on(outputStream* out) { |
8c5e6482cbfc
8024752: Log TraceMetadata* output to gclog_or_tty instead of tty
stefank
parents:
12236
diff
changeset
|
767 out->print ("Virtual space:"); |
8c5e6482cbfc
8024752: Log TraceMetadata* output to gclog_or_tty instead of tty
stefank
parents:
12236
diff
changeset
|
768 if (special()) out->print(" (pinned in memory)"); |
8c5e6482cbfc
8024752: Log TraceMetadata* output to gclog_or_tty instead of tty
stefank
parents:
12236
diff
changeset
|
769 out->cr(); |
8c5e6482cbfc
8024752: Log TraceMetadata* output to gclog_or_tty instead of tty
stefank
parents:
12236
diff
changeset
|
770 out->print_cr(" - committed: " SIZE_FORMAT, committed_size()); |
8c5e6482cbfc
8024752: Log TraceMetadata* output to gclog_or_tty instead of tty
stefank
parents:
12236
diff
changeset
|
771 out->print_cr(" - reserved: " SIZE_FORMAT, reserved_size()); |
8c5e6482cbfc
8024752: Log TraceMetadata* output to gclog_or_tty instead of tty
stefank
parents:
12236
diff
changeset
|
772 out->print_cr(" - [low, high]: [" INTPTR_FORMAT ", " INTPTR_FORMAT "]", low(), high()); |
8c5e6482cbfc
8024752: Log TraceMetadata* output to gclog_or_tty instead of tty
stefank
parents:
12236
diff
changeset
|
773 out->print_cr(" - [low_b, high_b]: [" INTPTR_FORMAT ", " INTPTR_FORMAT "]", low_boundary(), high_boundary()); |
0 | 774 } |
775 | |
12240
8c5e6482cbfc
8024752: Log TraceMetadata* output to gclog_or_tty instead of tty
stefank
parents:
12236
diff
changeset
|
776 void VirtualSpace::print() { |
8c5e6482cbfc
8024752: Log TraceMetadata* output to gclog_or_tty instead of tty
stefank
parents:
12236
diff
changeset
|
777 print_on(tty); |
8c5e6482cbfc
8024752: Log TraceMetadata* output to gclog_or_tty instead of tty
stefank
parents:
12236
diff
changeset
|
778 } |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
779 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
780 /////////////// Unit tests /////////////// |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
781 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
782 #ifndef PRODUCT |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
783 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
784 #define test_log(...) \ |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
785 do {\ |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
786 if (VerboseInternalVMTests) { \ |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
787 tty->print_cr(__VA_ARGS__); \ |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
788 tty->flush(); \ |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
789 }\ |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
790 } while (false) |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
791 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
792 class TestReservedSpace : AllStatic { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
793 public: |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
794 static void small_page_write(void* addr, size_t size) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
795 size_t page_size = os::vm_page_size(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
796 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
797 char* end = (char*)addr + size; |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
798 for (char* p = (char*)addr; p < end; p += page_size) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
799 *p = 1; |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
800 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
801 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
802 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
803 static void release_memory_for_test(ReservedSpace rs) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
804 if (rs.special()) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
805 guarantee(os::release_memory_special(rs.base(), rs.size()), "Shouldn't fail"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
806 } else { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
807 guarantee(os::release_memory(rs.base(), rs.size()), "Shouldn't fail"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
808 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
809 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
810 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
811 static void test_reserved_space1(size_t size, size_t alignment) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
812 test_log("test_reserved_space1(%p)", (void*) (uintptr_t) size); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
813 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
814 assert(is_size_aligned(size, alignment), "Incorrect input parameters"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
815 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
816 ReservedSpace rs(size, // size |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
817 alignment, // alignment |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
818 UseLargePages, // large |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
819 NULL, // requested_address |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
820 0); // noacces_prefix |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
821 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
822 test_log(" rs.special() == %d", rs.special()); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
823 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
824 assert(rs.base() != NULL, "Must be"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
825 assert(rs.size() == size, "Must be"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
826 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
827 assert(is_ptr_aligned(rs.base(), alignment), "aligned sizes should always give aligned addresses"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
828 assert(is_size_aligned(rs.size(), alignment), "aligned sizes should always give aligned addresses"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
829 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
830 if (rs.special()) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
831 small_page_write(rs.base(), size); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
832 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
833 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
834 release_memory_for_test(rs); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
835 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
836 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
837 static void test_reserved_space2(size_t size) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
838 test_log("test_reserved_space2(%p)", (void*)(uintptr_t)size); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
839 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
840 assert(is_size_aligned(size, os::vm_allocation_granularity()), "Must be at least AG aligned"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
841 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
842 ReservedSpace rs(size); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
843 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
844 test_log(" rs.special() == %d", rs.special()); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
845 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
846 assert(rs.base() != NULL, "Must be"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
847 assert(rs.size() == size, "Must be"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
848 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
849 if (rs.special()) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
850 small_page_write(rs.base(), size); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
851 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
852 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
853 release_memory_for_test(rs); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
854 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
855 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
856 static void test_reserved_space3(size_t size, size_t alignment, bool maybe_large) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
857 test_log("test_reserved_space3(%p, %p, %d)", |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
858 (void*)(uintptr_t)size, (void*)(uintptr_t)alignment, maybe_large); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
859 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
860 assert(is_size_aligned(size, os::vm_allocation_granularity()), "Must be at least AG aligned"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
861 assert(is_size_aligned(size, alignment), "Must be at least aligned against alignment"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
862 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
863 bool large = maybe_large && UseLargePages && size >= os::large_page_size(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
864 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
865 ReservedSpace rs(size, alignment, large, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
866 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
867 test_log(" rs.special() == %d", rs.special()); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
868 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
869 assert(rs.base() != NULL, "Must be"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
870 assert(rs.size() == size, "Must be"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
871 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
872 if (rs.special()) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
873 small_page_write(rs.base(), size); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
874 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
875 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
876 release_memory_for_test(rs); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
877 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
878 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
879 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
880 static void test_reserved_space1() { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
881 size_t size = 2 * 1024 * 1024; |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
882 size_t ag = os::vm_allocation_granularity(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
883 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
884 test_reserved_space1(size, ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
885 test_reserved_space1(size * 2, ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
886 test_reserved_space1(size * 10, ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
887 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
888 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
889 static void test_reserved_space2() { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
890 size_t size = 2 * 1024 * 1024; |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
891 size_t ag = os::vm_allocation_granularity(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
892 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
893 test_reserved_space2(size * 1); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
894 test_reserved_space2(size * 2); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
895 test_reserved_space2(size * 10); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
896 test_reserved_space2(ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
897 test_reserved_space2(size - ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
898 test_reserved_space2(size); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
899 test_reserved_space2(size + ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
900 test_reserved_space2(size * 2); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
901 test_reserved_space2(size * 2 - ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
902 test_reserved_space2(size * 2 + ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
903 test_reserved_space2(size * 3); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
904 test_reserved_space2(size * 3 - ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
905 test_reserved_space2(size * 3 + ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
906 test_reserved_space2(size * 10); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
907 test_reserved_space2(size * 10 + size / 2); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
908 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
909 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
910 static void test_reserved_space3() { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
911 size_t ag = os::vm_allocation_granularity(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
912 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
913 test_reserved_space3(ag, ag , false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
914 test_reserved_space3(ag * 2, ag , false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
915 test_reserved_space3(ag * 3, ag , false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
916 test_reserved_space3(ag * 2, ag * 2, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
917 test_reserved_space3(ag * 4, ag * 2, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
918 test_reserved_space3(ag * 8, ag * 2, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
919 test_reserved_space3(ag * 4, ag * 4, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
920 test_reserved_space3(ag * 8, ag * 4, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
921 test_reserved_space3(ag * 16, ag * 4, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
922 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
923 if (UseLargePages) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
924 size_t lp = os::large_page_size(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
925 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
926 // Without large pages |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
927 test_reserved_space3(lp, ag * 4, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
928 test_reserved_space3(lp * 2, ag * 4, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
929 test_reserved_space3(lp * 4, ag * 4, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
930 test_reserved_space3(lp, lp , false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
931 test_reserved_space3(lp * 2, lp , false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
932 test_reserved_space3(lp * 3, lp , false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
933 test_reserved_space3(lp * 2, lp * 2, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
934 test_reserved_space3(lp * 4, lp * 2, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
935 test_reserved_space3(lp * 8, lp * 2, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
936 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
937 // With large pages |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
938 test_reserved_space3(lp, ag * 4 , true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
939 test_reserved_space3(lp * 2, ag * 4, true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
940 test_reserved_space3(lp * 4, ag * 4, true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
941 test_reserved_space3(lp, lp , true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
942 test_reserved_space3(lp * 2, lp , true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
943 test_reserved_space3(lp * 3, lp , true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
944 test_reserved_space3(lp * 2, lp * 2, true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
945 test_reserved_space3(lp * 4, lp * 2, true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
946 test_reserved_space3(lp * 8, lp * 2, true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
947 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
948 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
949 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
950 static void test_reserved_space() { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
951 test_reserved_space1(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
952 test_reserved_space2(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
953 test_reserved_space3(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
954 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
955 }; |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
956 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
957 void TestReservedSpace_test() { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
958 TestReservedSpace::test_reserved_space(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
959 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
960 |
12236
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
961 #define assert_equals(actual, expected) \ |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
962 assert(actual == expected, \ |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
963 err_msg("Got " SIZE_FORMAT " expected " \ |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
964 SIZE_FORMAT, actual, expected)); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
965 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
966 #define assert_ge(value1, value2) \ |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
967 assert(value1 >= value2, \ |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
968 err_msg("'" #value1 "': " SIZE_FORMAT " '" \ |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
969 #value2 "': " SIZE_FORMAT, value1, value2)); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
970 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
971 #define assert_lt(value1, value2) \ |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
972 assert(value1 < value2, \ |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
973 err_msg("'" #value1 "': " SIZE_FORMAT " '" \ |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
974 #value2 "': " SIZE_FORMAT, value1, value2)); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
975 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
976 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
977 class TestVirtualSpace : AllStatic { |
12834
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
978 enum TestLargePages { |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
979 Default, |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
980 Disable, |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
981 Reserve, |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
982 Commit |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
983 }; |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
984 |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
985 static ReservedSpace reserve_memory(size_t reserve_size_aligned, TestLargePages mode) { |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
986 switch(mode) { |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
987 default: |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
988 case Default: |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
989 case Reserve: |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
990 return ReservedSpace(reserve_size_aligned); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
991 case Disable: |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
992 case Commit: |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
993 return ReservedSpace(reserve_size_aligned, |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
994 os::vm_allocation_granularity(), |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
995 /* large */ false, /* exec */ false); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
996 } |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
997 } |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
998 |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
999 static bool initialize_virtual_space(VirtualSpace& vs, ReservedSpace rs, TestLargePages mode) { |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1000 switch(mode) { |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1001 default: |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1002 case Default: |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1003 case Reserve: |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1004 return vs.initialize(rs, 0); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1005 case Disable: |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1006 return vs.initialize_with_granularity(rs, 0, os::vm_page_size()); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1007 case Commit: |
22976 | 1008 return vs.initialize_with_granularity(rs, 0, os::page_size_for_region_unaligned(rs.size(), 1)); |
12834
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1009 } |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1010 } |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1011 |
12236
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1012 public: |
12834
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1013 static void test_virtual_space_actual_committed_space(size_t reserve_size, size_t commit_size, |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1014 TestLargePages mode = Default) { |
12236
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1015 size_t granularity = os::vm_allocation_granularity(); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1016 size_t reserve_size_aligned = align_size_up(reserve_size, granularity); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1017 |
12834
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1018 ReservedSpace reserved = reserve_memory(reserve_size_aligned, mode); |
12236
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1019 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1020 assert(reserved.is_reserved(), "Must be"); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1021 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1022 VirtualSpace vs; |
12834
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1023 bool initialized = initialize_virtual_space(vs, reserved, mode); |
12236
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1024 assert(initialized, "Failed to initialize VirtualSpace"); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1025 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1026 vs.expand_by(commit_size, false); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1027 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1028 if (vs.special()) { |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1029 assert_equals(vs.actual_committed_size(), reserve_size_aligned); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1030 } else { |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1031 assert_ge(vs.actual_committed_size(), commit_size); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1032 // Approximate the commit granularity. |
12834
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1033 // Make sure that we don't commit using large pages |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1034 // if large pages has been disabled for this VirtualSpace. |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1035 size_t commit_granularity = (mode == Disable || !UseLargePages) ? |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1036 os::vm_page_size() : os::large_page_size(); |
12236
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1037 assert_lt(vs.actual_committed_size(), commit_size + commit_granularity); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1038 } |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1039 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1040 reserved.release(); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1041 } |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1042 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1043 static void test_virtual_space_actual_committed_space_one_large_page() { |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1044 if (!UseLargePages) { |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1045 return; |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1046 } |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1047 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1048 size_t large_page_size = os::large_page_size(); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1049 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1050 ReservedSpace reserved(large_page_size, large_page_size, true, false); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1051 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1052 assert(reserved.is_reserved(), "Must be"); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1053 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1054 VirtualSpace vs; |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1055 bool initialized = vs.initialize(reserved, 0); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1056 assert(initialized, "Failed to initialize VirtualSpace"); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1057 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1058 vs.expand_by(large_page_size, false); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1059 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1060 assert_equals(vs.actual_committed_size(), large_page_size); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1061 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1062 reserved.release(); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1063 } |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1064 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1065 static void test_virtual_space_actual_committed_space() { |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1066 test_virtual_space_actual_committed_space(4 * K, 0); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1067 test_virtual_space_actual_committed_space(4 * K, 4 * K); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1068 test_virtual_space_actual_committed_space(8 * K, 0); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1069 test_virtual_space_actual_committed_space(8 * K, 4 * K); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1070 test_virtual_space_actual_committed_space(8 * K, 8 * K); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1071 test_virtual_space_actual_committed_space(12 * K, 0); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1072 test_virtual_space_actual_committed_space(12 * K, 4 * K); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1073 test_virtual_space_actual_committed_space(12 * K, 8 * K); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1074 test_virtual_space_actual_committed_space(12 * K, 12 * K); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1075 test_virtual_space_actual_committed_space(64 * K, 0); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1076 test_virtual_space_actual_committed_space(64 * K, 32 * K); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1077 test_virtual_space_actual_committed_space(64 * K, 64 * K); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1078 test_virtual_space_actual_committed_space(2 * M, 0); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1079 test_virtual_space_actual_committed_space(2 * M, 4 * K); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1080 test_virtual_space_actual_committed_space(2 * M, 64 * K); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1081 test_virtual_space_actual_committed_space(2 * M, 1 * M); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1082 test_virtual_space_actual_committed_space(2 * M, 2 * M); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1083 test_virtual_space_actual_committed_space(10 * M, 0); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1084 test_virtual_space_actual_committed_space(10 * M, 4 * K); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1085 test_virtual_space_actual_committed_space(10 * M, 8 * K); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1086 test_virtual_space_actual_committed_space(10 * M, 1 * M); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1087 test_virtual_space_actual_committed_space(10 * M, 2 * M); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1088 test_virtual_space_actual_committed_space(10 * M, 5 * M); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1089 test_virtual_space_actual_committed_space(10 * M, 10 * M); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1090 } |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1091 |
12834
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1092 static void test_virtual_space_disable_large_pages() { |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1093 if (!UseLargePages) { |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1094 return; |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1095 } |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1096 // These test cases verify that if we force VirtualSpace to disable large pages |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1097 test_virtual_space_actual_committed_space(10 * M, 0, Disable); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1098 test_virtual_space_actual_committed_space(10 * M, 4 * K, Disable); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1099 test_virtual_space_actual_committed_space(10 * M, 8 * K, Disable); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1100 test_virtual_space_actual_committed_space(10 * M, 1 * M, Disable); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1101 test_virtual_space_actual_committed_space(10 * M, 2 * M, Disable); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1102 test_virtual_space_actual_committed_space(10 * M, 5 * M, Disable); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1103 test_virtual_space_actual_committed_space(10 * M, 10 * M, Disable); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1104 |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1105 test_virtual_space_actual_committed_space(10 * M, 0, Reserve); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1106 test_virtual_space_actual_committed_space(10 * M, 4 * K, Reserve); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1107 test_virtual_space_actual_committed_space(10 * M, 8 * K, Reserve); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1108 test_virtual_space_actual_committed_space(10 * M, 1 * M, Reserve); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1109 test_virtual_space_actual_committed_space(10 * M, 2 * M, Reserve); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1110 test_virtual_space_actual_committed_space(10 * M, 5 * M, Reserve); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1111 test_virtual_space_actual_committed_space(10 * M, 10 * M, Reserve); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1112 |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1113 test_virtual_space_actual_committed_space(10 * M, 0, Commit); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1114 test_virtual_space_actual_committed_space(10 * M, 4 * K, Commit); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1115 test_virtual_space_actual_committed_space(10 * M, 8 * K, Commit); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1116 test_virtual_space_actual_committed_space(10 * M, 1 * M, Commit); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1117 test_virtual_space_actual_committed_space(10 * M, 2 * M, Commit); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1118 test_virtual_space_actual_committed_space(10 * M, 5 * M, Commit); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1119 test_virtual_space_actual_committed_space(10 * M, 10 * M, Commit); |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1120 } |
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1121 |
12236
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1122 static void test_virtual_space() { |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1123 test_virtual_space_actual_committed_space(); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1124 test_virtual_space_actual_committed_space_one_large_page(); |
12834
04b18a42c2f3
8025526: VirtualSpace should support per-instance disabling of large pages
mgerdin
parents:
12240
diff
changeset
|
1125 test_virtual_space_disable_large_pages(); |
12236
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1126 } |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1127 }; |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1128 |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1129 void TestVirtualSpace_test() { |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1130 TestVirtualSpace::test_virtual_space(); |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1131 } |
c4c768305a8f
8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents:
12110
diff
changeset
|
1132 |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
1133 #endif // PRODUCT |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
1134 |
0 | 1135 #endif |