src/share/vm/runtime/virtualspace.cpp

changeset 1077
660978a2a31a
parent 815
eb28cf662f56
child 1091
6bdd6923ba16
equal deleted inserted replaced
1076:6af0a709d52b 1077:660978a2a31a
107 107
108 ReservedSpace::ReservedSpace(const size_t prefix_size, 108 ReservedSpace::ReservedSpace(const size_t prefix_size,
109 const size_t prefix_align, 109 const size_t prefix_align,
110 const size_t suffix_size, 110 const size_t suffix_size,
111 const size_t suffix_align, 111 const size_t suffix_align,
112 char* requested_address,
112 const size_t noaccess_prefix) 113 const size_t noaccess_prefix)
113 { 114 {
114 assert(prefix_size != 0, "sanity"); 115 assert(prefix_size != 0, "sanity");
115 assert(prefix_align != 0, "sanity"); 116 assert(prefix_align != 0, "sanity");
116 assert(suffix_size != 0, "sanity"); 117 assert(suffix_size != 0, "sanity");
129 // On systems where the entire region has to be reserved and committed up 130 // On systems where the entire region has to be reserved and committed up
130 // front, the compound alignment normally done by this method is unnecessary. 131 // front, the compound alignment normally done by this method is unnecessary.
131 const bool try_reserve_special = UseLargePages && 132 const bool try_reserve_special = UseLargePages &&
132 prefix_align == os::large_page_size(); 133 prefix_align == os::large_page_size();
133 if (!os::can_commit_large_page_memory() && try_reserve_special) { 134 if (!os::can_commit_large_page_memory() && try_reserve_special) {
134 initialize(size, prefix_align, true, NULL, noaccess_prefix); 135 initialize(size, prefix_align, true, requested_address, noaccess_prefix);
135 return; 136 return;
136 } 137 }
137 138
138 _base = NULL; 139 _base = NULL;
139 _size = 0; 140 _size = 0;
144 // Assert that if noaccess_prefix is used, it is the same as prefix_align. 145 // Assert that if noaccess_prefix is used, it is the same as prefix_align.
145 assert(noaccess_prefix == 0 || 146 assert(noaccess_prefix == 0 ||
146 noaccess_prefix == prefix_align, "noaccess prefix wrong"); 147 noaccess_prefix == prefix_align, "noaccess prefix wrong");
147 148
148 // Optimistically try to reserve the exact size needed. 149 // Optimistically try to reserve the exact size needed.
149 char* addr = os::reserve_memory(size, NULL, prefix_align); 150 char* addr;
151 if (requested_address != 0) {
152 addr = os::attempt_reserve_memory_at(size,
153 requested_address-noaccess_prefix);
154 } else {
155 addr = os::reserve_memory(size, NULL, prefix_align);
156 }
150 if (addr == NULL) return; 157 if (addr == NULL) return;
151 158
152 // Check whether the result has the needed alignment (unlikely unless 159 // Check whether the result has the needed alignment (unlikely unless
153 // prefix_align == suffix_align). 160 // prefix_align == suffix_align).
154 const size_t ofs = size_t(addr) + adjusted_prefix_size & suffix_align - 1; 161 const size_t ofs = size_t(addr) + adjusted_prefix_size & suffix_align - 1;
204 // to use reserve_memory_special() to reserve and pin the entire region. 211 // to use reserve_memory_special() to reserve and pin the entire region.
205 bool special = large && !os::can_commit_large_page_memory(); 212 bool special = large && !os::can_commit_large_page_memory();
206 char* base = NULL; 213 char* base = NULL;
207 214
208 if (special) { 215 if (special) {
209 // It's not hard to implement reserve_memory_special() such that it can 216
210 // allocate at fixed address, but there seems no use of this feature 217 base = os::reserve_memory_special(size, requested_address);
211 // for now, so it's not implemented.
212 assert(requested_address == NULL, "not implemented");
213
214 base = os::reserve_memory_special(size);
215 218
216 if (base != NULL) { 219 if (base != NULL) {
217 // Check alignment constraints 220 // Check alignment constraints
218 if (alignment > 0) { 221 if (alignment > 0) {
219 assert((uintptr_t) base % alignment == 0, 222 assert((uintptr_t) base % alignment == 0,
370 373
371 ReservedHeapSpace::ReservedHeapSpace(size_t size, size_t alignment, 374 ReservedHeapSpace::ReservedHeapSpace(size_t size, size_t alignment,
372 bool large, char* requested_address) : 375 bool large, char* requested_address) :
373 ReservedSpace(size, alignment, large, 376 ReservedSpace(size, alignment, large,
374 requested_address, 377 requested_address,
375 UseCompressedOops && UseImplicitNullCheckForNarrowOop ? 378 (UseCompressedOops && (Universe::narrow_oop_base() != NULL) &&
379 Universe::narrow_oop_use_implicit_null_checks()) ?
376 lcm(os::vm_page_size(), alignment) : 0) { 380 lcm(os::vm_page_size(), alignment) : 0) {
377 // Only reserved space for the java heap should have a noaccess_prefix 381 // Only reserved space for the java heap should have a noaccess_prefix
378 // if using compressed oops. 382 // if using compressed oops.
379 protect_noaccess_prefix(size); 383 protect_noaccess_prefix(size);
380 } 384 }
381 385
382 ReservedHeapSpace::ReservedHeapSpace(const size_t prefix_size, 386 ReservedHeapSpace::ReservedHeapSpace(const size_t prefix_size,
383 const size_t prefix_align, 387 const size_t prefix_align,
384 const size_t suffix_size, 388 const size_t suffix_size,
385 const size_t suffix_align) : 389 const size_t suffix_align,
390 char* requested_address) :
386 ReservedSpace(prefix_size, prefix_align, suffix_size, suffix_align, 391 ReservedSpace(prefix_size, prefix_align, suffix_size, suffix_align,
387 UseCompressedOops && UseImplicitNullCheckForNarrowOop ? 392 requested_address,
393 (UseCompressedOops && (Universe::narrow_oop_base() != NULL) &&
394 Universe::narrow_oop_use_implicit_null_checks()) ?
388 lcm(os::vm_page_size(), prefix_align) : 0) { 395 lcm(os::vm_page_size(), prefix_align) : 0) {
389 protect_noaccess_prefix(prefix_size+suffix_size); 396 protect_noaccess_prefix(prefix_size+suffix_size);
390 } 397 }
391 398
392 // VirtualSpace 399 // VirtualSpace

mercurial