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 |