annotate src/share/vm/runtime/virtualspace.cpp @ 13212:eb03a7335eb0

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