hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
changeset 10237 df347ffafa0d
parent 10236 c4256e927bed
child 10243 d00a21009f1f
equal deleted inserted replaced
10236:c4256e927bed 10237:df347ffafa0d
  1899 
  1899 
  1900   // Reserve the maximum.
  1900   // Reserve the maximum.
  1901   PermanentGenerationSpec* pgs = collector_policy()->permanent_generation();
  1901   PermanentGenerationSpec* pgs = collector_policy()->permanent_generation();
  1902   // Includes the perm-gen.
  1902   // Includes the perm-gen.
  1903 
  1903 
  1904   const size_t total_reserved = max_byte_size + pgs->max_size();
  1904   // When compressed oops are enabled, the preferred heap base
       
  1905   // is calculated by subtracting the requested size from the
       
  1906   // 32Gb boundary and using the result as the base address for
       
  1907   // heap reservation. If the requested size is not aligned to
       
  1908   // HeapRegion::GrainBytes (i.e. the alignment that is passed
       
  1909   // into the ReservedHeapSpace constructor) then the actual
       
  1910   // base of the reserved heap may end up differing from the
       
  1911   // address that was requested (i.e. the preferred heap base).
       
  1912   // If this happens then we could end up using a non-optimal
       
  1913   // compressed oops mode.
       
  1914 
       
  1915   // Since max_byte_size is aligned to the size of a heap region (checked
       
  1916   // above), we also need to align the perm gen size as it might not be.
       
  1917   const size_t total_reserved = max_byte_size +
       
  1918                                 align_size_up(pgs->max_size(), HeapRegion::GrainBytes);
       
  1919   Universe::check_alignment(total_reserved, HeapRegion::GrainBytes, "g1 heap and perm");
       
  1920 
  1905   char* addr = Universe::preferred_heap_base(total_reserved, Universe::UnscaledNarrowOop);
  1921   char* addr = Universe::preferred_heap_base(total_reserved, Universe::UnscaledNarrowOop);
  1906 
  1922 
  1907   ReservedSpace heap_rs(max_byte_size + pgs->max_size(),
  1923   ReservedHeapSpace heap_rs(total_reserved, HeapRegion::GrainBytes,
  1908                         HeapRegion::GrainBytes,
  1924                             UseLargePages, addr);
  1909                         UseLargePages, addr);
       
  1910 
  1925 
  1911   if (UseCompressedOops) {
  1926   if (UseCompressedOops) {
  1912     if (addr != NULL && !heap_rs.is_reserved()) {
  1927     if (addr != NULL && !heap_rs.is_reserved()) {
  1913       // Failed to reserve at specified address - the requested memory
  1928       // Failed to reserve at specified address - the requested memory
  1914       // region is taken already, for example, by 'java' launcher.
  1929       // region is taken already, for example, by 'java' launcher.
  1915       // Try again to reserver heap higher.
  1930       // Try again to reserver heap higher.
  1916       addr = Universe::preferred_heap_base(total_reserved, Universe::ZeroBasedNarrowOop);
  1931       addr = Universe::preferred_heap_base(total_reserved, Universe::ZeroBasedNarrowOop);
  1917       ReservedSpace heap_rs0(total_reserved, HeapRegion::GrainBytes,
  1932 
  1918                              UseLargePages, addr);
  1933       ReservedHeapSpace heap_rs0(total_reserved, HeapRegion::GrainBytes,
       
  1934                                  UseLargePages, addr);
       
  1935 
  1919       if (addr != NULL && !heap_rs0.is_reserved()) {
  1936       if (addr != NULL && !heap_rs0.is_reserved()) {
  1920         // Failed to reserve at specified address again - give up.
  1937         // Failed to reserve at specified address again - give up.
  1921         addr = Universe::preferred_heap_base(total_reserved, Universe::HeapBasedNarrowOop);
  1938         addr = Universe::preferred_heap_base(total_reserved, Universe::HeapBasedNarrowOop);
  1922         assert(addr == NULL, "");
  1939         assert(addr == NULL, "");
  1923         ReservedSpace heap_rs1(total_reserved, HeapRegion::GrainBytes,
  1940 
  1924                                UseLargePages, addr);
  1941         ReservedHeapSpace heap_rs1(total_reserved, HeapRegion::GrainBytes,
       
  1942                                    UseLargePages, addr);
  1925         heap_rs = heap_rs1;
  1943         heap_rs = heap_rs1;
  1926       } else {
  1944       } else {
  1927         heap_rs = heap_rs0;
  1945         heap_rs = heap_rs0;
  1928       }
  1946       }
  1929     }
  1947     }