comparison src/share/vm/memory/collectorPolicy.cpp @ 12233:40136aa2cdb1

8010722: assert: failed: heap size is too big for compressed oops Summary: Use conservative assumptions of required alignment for the various garbage collector components into account when determining the maximum heap size that supports compressed oops. Using this conservative value avoids several circular dependencies in the calculation. Reviewed-by: stefank, dholmes
author tschatzl
date Wed, 11 Sep 2013 16:25:02 +0200
parents 4c84d351cca9
children 9e11762cee52
comparison
equal deleted inserted replaced
12230:040895ec3920 12233:40136aa2cdb1
143 _should_clear_all_soft_refs = size_policy()->gc_overhead_limit_near(); 143 _should_clear_all_soft_refs = size_policy()->gc_overhead_limit_near();
144 } 144 }
145 _all_soft_refs_clear = true; 145 _all_soft_refs_clear = true;
146 } 146 }
147 147
148 size_t CollectorPolicy::compute_max_alignment() {
149 // The card marking array and the offset arrays for old generations are
150 // committed in os pages as well. Make sure they are entirely full (to
151 // avoid partial page problems), e.g. if 512 bytes heap corresponds to 1
152 // byte entry and the os page size is 4096, the maximum heap size should
153 // be 512*4096 = 2MB aligned.
154
155 // There is only the GenRemSet in Hotspot and only the GenRemSet::CardTable
156 // is supported.
157 // Requirements of any new remembered set implementations must be added here.
158 size_t alignment = GenRemSet::max_alignment_constraint(GenRemSet::CardTable);
159
160 // Parallel GC does its own alignment of the generations to avoid requiring a
161 // large page (256M on some platforms) for the permanent generation. The
162 // other collectors should also be updated to do their own alignment and then
163 // this use of lcm() should be removed.
164 if (UseLargePages && !UseParallelGC) {
165 // in presence of large pages we have to make sure that our
166 // alignment is large page aware
167 alignment = lcm(os::large_page_size(), alignment);
168 }
169
170 return alignment;
171 }
148 172
149 // GenCollectorPolicy methods. 173 // GenCollectorPolicy methods.
150 174
151 size_t GenCollectorPolicy::scale_by_NewRatio_aligned(size_t base_size) { 175 size_t GenCollectorPolicy::scale_by_NewRatio_aligned(size_t base_size) {
152 size_t x = base_size / (NewRatio+1); 176 size_t x = base_size / (NewRatio+1);
171 _size_policy = new AdaptiveSizePolicy(init_eden_size, 195 _size_policy = new AdaptiveSizePolicy(init_eden_size,
172 init_promo_size, 196 init_promo_size,
173 init_survivor_size, 197 init_survivor_size,
174 max_gc_pause_sec, 198 max_gc_pause_sec,
175 GCTimeRatio); 199 GCTimeRatio);
176 }
177
178 size_t GenCollectorPolicy::compute_max_alignment() {
179 // The card marking array and the offset arrays for old generations are
180 // committed in os pages as well. Make sure they are entirely full (to
181 // avoid partial page problems), e.g. if 512 bytes heap corresponds to 1
182 // byte entry and the os page size is 4096, the maximum heap size should
183 // be 512*4096 = 2MB aligned.
184 size_t alignment = GenRemSet::max_alignment_constraint(rem_set_name());
185
186 // Parallel GC does its own alignment of the generations to avoid requiring a
187 // large page (256M on some platforms) for the permanent generation. The
188 // other collectors should also be updated to do their own alignment and then
189 // this use of lcm() should be removed.
190 if (UseLargePages && !UseParallelGC) {
191 // in presence of large pages we have to make sure that our
192 // alignment is large page aware
193 alignment = lcm(os::large_page_size(), alignment);
194 }
195
196 assert(alignment >= min_alignment(), "Must be");
197
198 return alignment;
199 } 200 }
200 201
201 void GenCollectorPolicy::initialize_flags() { 202 void GenCollectorPolicy::initialize_flags() {
202 // All sizes must be multiples of the generation granularity. 203 // All sizes must be multiples of the generation granularity.
203 set_min_alignment((uintx) Generation::GenGrain); 204 set_min_alignment((uintx) Generation::GenGrain);