1.1 --- a/src/share/vm/memory/universe.cpp Sun Aug 25 21:21:18 2013 -0400 1.2 +++ b/src/share/vm/memory/universe.cpp Fri Aug 16 13:22:32 2013 +0200 1.3 @@ -681,17 +681,23 @@ 1.4 // 32Gb 1.5 // OopEncodingHeapMax == NarrowOopHeapMax << LogMinObjAlignmentInBytes; 1.6 1.7 -char* Universe::preferred_heap_base(size_t heap_size, NARROW_OOP_MODE mode) { 1.8 +char* Universe::preferred_heap_base(size_t heap_size, size_t alignment, NARROW_OOP_MODE mode) { 1.9 + assert(is_size_aligned((size_t)OopEncodingHeapMax, alignment), "Must be"); 1.10 + assert(is_size_aligned((size_t)NarrowOopHeapMax, alignment), "Must be"); 1.11 + assert(is_size_aligned(heap_size, alignment), "Must be"); 1.12 + 1.13 + uintx heap_base_min_address_aligned = align_size_up(HeapBaseMinAddress, alignment); 1.14 + 1.15 size_t base = 0; 1.16 #ifdef _LP64 1.17 if (UseCompressedOops) { 1.18 assert(mode == UnscaledNarrowOop || 1.19 mode == ZeroBasedNarrowOop || 1.20 mode == HeapBasedNarrowOop, "mode is invalid"); 1.21 - const size_t total_size = heap_size + HeapBaseMinAddress; 1.22 + const size_t total_size = heap_size + heap_base_min_address_aligned; 1.23 // Return specified base for the first request. 1.24 if (!FLAG_IS_DEFAULT(HeapBaseMinAddress) && (mode == UnscaledNarrowOop)) { 1.25 - base = HeapBaseMinAddress; 1.26 + base = heap_base_min_address_aligned; 1.27 1.28 // If the total size is small enough to allow UnscaledNarrowOop then 1.29 // just use UnscaledNarrowOop. 1.30 @@ -742,6 +748,8 @@ 1.31 } 1.32 } 1.33 #endif 1.34 + 1.35 + assert(is_ptr_aligned((char*)base, alignment), "Must be"); 1.36 return (char*)base; // also return NULL (don't care) for 32-bit VM 1.37 } 1.38 1.39 @@ -867,27 +875,33 @@ 1.40 size_t total_reserved = align_size_up(heap_size, alignment); 1.41 assert(!UseCompressedOops || (total_reserved <= (OopEncodingHeapMax - os::vm_page_size())), 1.42 "heap size is too big for compressed oops"); 1.43 - char* addr = Universe::preferred_heap_base(total_reserved, Universe::UnscaledNarrowOop); 1.44 1.45 - ReservedHeapSpace total_rs(total_reserved, alignment, UseLargePages, addr); 1.46 + bool use_large_pages = UseLargePages && is_size_aligned(alignment, os::large_page_size()); 1.47 + assert(!UseLargePages 1.48 + || UseParallelOldGC 1.49 + || use_large_pages, "Wrong alignment to use large pages"); 1.50 + 1.51 + char* addr = Universe::preferred_heap_base(total_reserved, alignment, Universe::UnscaledNarrowOop); 1.52 + 1.53 + ReservedHeapSpace total_rs(total_reserved, alignment, use_large_pages, addr); 1.54 1.55 if (UseCompressedOops) { 1.56 if (addr != NULL && !total_rs.is_reserved()) { 1.57 // Failed to reserve at specified address - the requested memory 1.58 // region is taken already, for example, by 'java' launcher. 1.59 // Try again to reserver heap higher. 1.60 - addr = Universe::preferred_heap_base(total_reserved, Universe::ZeroBasedNarrowOop); 1.61 + addr = Universe::preferred_heap_base(total_reserved, alignment, Universe::ZeroBasedNarrowOop); 1.62 1.63 ReservedHeapSpace total_rs0(total_reserved, alignment, 1.64 - UseLargePages, addr); 1.65 + use_large_pages, addr); 1.66 1.67 if (addr != NULL && !total_rs0.is_reserved()) { 1.68 // Failed to reserve at specified address again - give up. 1.69 - addr = Universe::preferred_heap_base(total_reserved, Universe::HeapBasedNarrowOop); 1.70 + addr = Universe::preferred_heap_base(total_reserved, alignment, Universe::HeapBasedNarrowOop); 1.71 assert(addr == NULL, ""); 1.72 1.73 ReservedHeapSpace total_rs1(total_reserved, alignment, 1.74 - UseLargePages, addr); 1.75 + use_large_pages, addr); 1.76 total_rs = total_rs1; 1.77 } else { 1.78 total_rs = total_rs0;