comparison src/share/vm/memory/genCollectedHeap.cpp @ 12110:4c84d351cca9

8007074: SIGSEGV at ParMarkBitMap::verify_clear() Summary: Replace the broken large pages implementation on Linux. New flag: -XX:+UseTransparentHugePages - Linux specific flag to turn on transparent huge page hinting with madvise(..., MAP_HUGETLB). Changed behavior: -XX:+UseLargePages - tries to use -XX:+UseTransparentHugePages before trying other large pages implementations (on Linux). Changed behavior: -XX:+UseHugeTLBFS - Use upfront allocation of Large Pages instead of using the broken implementation to dynamically committing large pages. Changed behavior: -XX:LargePageSizeInBytes - Turned off the ability to use this flag on Linux and provides warning to user if set to a value different than the OS chosen large page size. Changed behavior: Setting no large page size - Now defaults to use -XX:UseTransparentHugePages if the OS supports it. Previously, -XX:+UseHugeTLBFS was chosen if the OS was configured to use large pages. Reviewed-by: tschatzl, dcubed, brutisso
author stefank
date Fri, 16 Aug 2013 13:22:32 +0200
parents 1a8fb39bdbc4
children 46d7652b223c
comparison
equal deleted inserted replaced
12108:badf4244ceae 12110:4c84d351cca9
93 // cases incorrectly returns the size in wordSize units rather than 93 // cases incorrectly returns the size in wordSize units rather than
94 // HeapWordSize). 94 // HeapWordSize).
95 guarantee(HeapWordSize == wordSize, "HeapWordSize must equal wordSize"); 95 guarantee(HeapWordSize == wordSize, "HeapWordSize must equal wordSize");
96 96
97 // The heap must be at least as aligned as generations. 97 // The heap must be at least as aligned as generations.
98 size_t alignment = Generation::GenGrain; 98 size_t gen_alignment = Generation::GenGrain;
99 99
100 _gen_specs = gen_policy()->generations(); 100 _gen_specs = gen_policy()->generations();
101 101
102 // Make sure the sizes are all aligned. 102 // Make sure the sizes are all aligned.
103 for (i = 0; i < _n_gens; i++) { 103 for (i = 0; i < _n_gens; i++) {
104 _gen_specs[i]->align(alignment); 104 _gen_specs[i]->align(gen_alignment);
105 } 105 }
106 106
107 // Allocate space for the heap. 107 // Allocate space for the heap.
108 108
109 char* heap_address; 109 char* heap_address;
110 size_t total_reserved = 0; 110 size_t total_reserved = 0;
111 int n_covered_regions = 0; 111 int n_covered_regions = 0;
112 ReservedSpace heap_rs(0); 112 ReservedSpace heap_rs;
113 113
114 heap_address = allocate(alignment, &total_reserved, 114 size_t heap_alignment = collector_policy()->max_alignment();
115
116 heap_address = allocate(heap_alignment, &total_reserved,
115 &n_covered_regions, &heap_rs); 117 &n_covered_regions, &heap_rs);
116 118
117 if (!heap_rs.is_reserved()) { 119 if (!heap_rs.is_reserved()) {
118 vm_shutdown_during_initialization( 120 vm_shutdown_during_initialization(
119 "Could not reserve enough space for object heap"); 121 "Could not reserve enough space for object heap");
166 size_t total_reserved = 0; 168 size_t total_reserved = 0;
167 int n_covered_regions = 0; 169 int n_covered_regions = 0;
168 const size_t pageSize = UseLargePages ? 170 const size_t pageSize = UseLargePages ?
169 os::large_page_size() : os::vm_page_size(); 171 os::large_page_size() : os::vm_page_size();
170 172
173 assert(alignment % pageSize == 0, "Must be");
174
171 for (int i = 0; i < _n_gens; i++) { 175 for (int i = 0; i < _n_gens; i++) {
172 total_reserved += _gen_specs[i]->max_size(); 176 total_reserved += _gen_specs[i]->max_size();
173 if (total_reserved < _gen_specs[i]->max_size()) { 177 if (total_reserved < _gen_specs[i]->max_size()) {
174 vm_exit_during_initialization(overflow_msg); 178 vm_exit_during_initialization(overflow_msg);
175 } 179 }
176 n_covered_regions += _gen_specs[i]->n_covered_regions(); 180 n_covered_regions += _gen_specs[i]->n_covered_regions();
177 } 181 }
178 assert(total_reserved % pageSize == 0, 182 assert(total_reserved % alignment == 0,
179 err_msg("Gen size; total_reserved=" SIZE_FORMAT ", pageSize=" 183 err_msg("Gen size; total_reserved=" SIZE_FORMAT ", alignment="
180 SIZE_FORMAT, total_reserved, pageSize)); 184 SIZE_FORMAT, total_reserved, alignment));
181 185
182 // Needed until the cardtable is fixed to have the right number 186 // Needed until the cardtable is fixed to have the right number
183 // of covered regions. 187 // of covered regions.
184 n_covered_regions += 2; 188 n_covered_regions += 2;
185 189
186 if (UseLargePages) { 190 *_total_reserved = total_reserved;
187 assert(total_reserved != 0, "total_reserved cannot be 0"); 191 *_n_covered_regions = n_covered_regions;
188 total_reserved = round_to(total_reserved, os::large_page_size()); 192
189 if (total_reserved < os::large_page_size()) {
190 vm_exit_during_initialization(overflow_msg);
191 }
192 }
193
194 *_total_reserved = total_reserved;
195 *_n_covered_regions = n_covered_regions;
196 *heap_rs = Universe::reserve_heap(total_reserved, alignment); 193 *heap_rs = Universe::reserve_heap(total_reserved, alignment);
197 return heap_rs->base(); 194 return heap_rs->base();
198 } 195 }
199 196
200 197