Mercurial > hg > truffle
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 |