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 } |