src/share/vm/memory/universe.cpp

changeset 5578
4c84d351cca9
parent 5531
1a8fb39bdbc4
child 5694
7944aba7ba41
child 5726
69f26e8e09f9
child 6462
e2722a66aba7
     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;

mercurial