103 if (_min_heap_byte_size < M) { |
103 if (_min_heap_byte_size < M) { |
104 vm_exit_during_initialization("Too small minimum heap"); |
104 vm_exit_during_initialization("Too small minimum heap"); |
105 } |
105 } |
106 |
106 |
107 // User inputs from -Xmx and -Xms must be aligned |
107 // User inputs from -Xmx and -Xms must be aligned |
108 _min_heap_byte_size = align_size_up(_min_heap_byte_size, _heap_alignment); |
108 _min_heap_byte_size = align_up(_min_heap_byte_size, _heap_alignment); |
109 size_t aligned_initial_heap_size = align_size_up(InitialHeapSize, _heap_alignment); |
109 size_t aligned_initial_heap_size = align_up(InitialHeapSize, _heap_alignment); |
110 size_t aligned_max_heap_size = align_size_up(MaxHeapSize, _heap_alignment); |
110 size_t aligned_max_heap_size = align_up(MaxHeapSize, _heap_alignment); |
111 |
111 |
112 // Write back to flags if the values changed |
112 // Write back to flags if the values changed |
113 if (aligned_initial_heap_size != InitialHeapSize) { |
113 if (aligned_initial_heap_size != InitialHeapSize) { |
114 FLAG_SET_ERGO(size_t, InitialHeapSize, aligned_initial_heap_size); |
114 FLAG_SET_ERGO(size_t, InitialHeapSize, aligned_initial_heap_size); |
115 } |
115 } |
131 } |
131 } |
132 |
132 |
133 _initial_heap_byte_size = InitialHeapSize; |
133 _initial_heap_byte_size = InitialHeapSize; |
134 _max_heap_byte_size = MaxHeapSize; |
134 _max_heap_byte_size = MaxHeapSize; |
135 |
135 |
136 FLAG_SET_ERGO(size_t, MinHeapDeltaBytes, align_size_up(MinHeapDeltaBytes, _space_alignment)); |
136 FLAG_SET_ERGO(size_t, MinHeapDeltaBytes, align_up(MinHeapDeltaBytes, _space_alignment)); |
137 |
137 |
138 DEBUG_ONLY(CollectorPolicy::assert_flags();) |
138 DEBUG_ONLY(CollectorPolicy::assert_flags();) |
139 } |
139 } |
140 |
140 |
141 void CollectorPolicy::initialize_size_info() { |
141 void CollectorPolicy::initialize_size_info() { |
196 _young_gen_spec(NULL), |
196 _young_gen_spec(NULL), |
197 _old_gen_spec(NULL) |
197 _old_gen_spec(NULL) |
198 {} |
198 {} |
199 |
199 |
200 size_t GenCollectorPolicy::scale_by_NewRatio_aligned(size_t base_size) { |
200 size_t GenCollectorPolicy::scale_by_NewRatio_aligned(size_t base_size) { |
201 return align_size_down_bounded(base_size / (NewRatio + 1), _gen_alignment); |
201 return align_down_bounded(base_size / (NewRatio + 1), _gen_alignment); |
202 } |
202 } |
203 |
203 |
204 size_t GenCollectorPolicy::bound_minus_alignment(size_t desired_size, |
204 size_t GenCollectorPolicy::bound_minus_alignment(size_t desired_size, |
205 size_t maximum_size) { |
205 size_t maximum_size) { |
206 size_t max_minus = maximum_size - _gen_alignment; |
206 size_t max_minus = maximum_size - _gen_alignment; |
219 GCTimeRatio); |
219 GCTimeRatio); |
220 } |
220 } |
221 |
221 |
222 size_t GenCollectorPolicy::young_gen_size_lower_bound() { |
222 size_t GenCollectorPolicy::young_gen_size_lower_bound() { |
223 // The young generation must be aligned and have room for eden + two survivors |
223 // The young generation must be aligned and have room for eden + two survivors |
224 return align_size_up(3 * _space_alignment, _gen_alignment); |
224 return align_up(3 * _space_alignment, _gen_alignment); |
225 } |
225 } |
226 |
226 |
227 size_t GenCollectorPolicy::old_gen_size_lower_bound() { |
227 size_t GenCollectorPolicy::old_gen_size_lower_bound() { |
228 return align_size_up(_space_alignment, _gen_alignment); |
228 return align_up(_space_alignment, _gen_alignment); |
229 } |
229 } |
230 |
230 |
231 #ifdef ASSERT |
231 #ifdef ASSERT |
232 void GenCollectorPolicy::assert_flags() { |
232 void GenCollectorPolicy::assert_flags() { |
233 CollectorPolicy::assert_flags(); |
233 CollectorPolicy::assert_flags(); |
285 |
285 |
286 // All generational heaps have a young gen; handle those flags here |
286 // All generational heaps have a young gen; handle those flags here |
287 |
287 |
288 // Make sure the heap is large enough for two generations |
288 // Make sure the heap is large enough for two generations |
289 size_t smallest_new_size = young_gen_size_lower_bound(); |
289 size_t smallest_new_size = young_gen_size_lower_bound(); |
290 size_t smallest_heap_size = align_size_up(smallest_new_size + old_gen_size_lower_bound(), |
290 size_t smallest_heap_size = align_up(smallest_new_size + old_gen_size_lower_bound(), |
291 _heap_alignment); |
291 _heap_alignment); |
292 if (MaxHeapSize < smallest_heap_size) { |
292 if (MaxHeapSize < smallest_heap_size) { |
293 FLAG_SET_ERGO(size_t, MaxHeapSize, smallest_heap_size); |
293 FLAG_SET_ERGO(size_t, MaxHeapSize, smallest_heap_size); |
294 _max_heap_byte_size = MaxHeapSize; |
294 _max_heap_byte_size = MaxHeapSize; |
295 } |
295 } |
309 } |
309 } |
310 |
310 |
311 // Now take the actual NewSize into account. We will silently increase NewSize |
311 // Now take the actual NewSize into account. We will silently increase NewSize |
312 // if the user specified a smaller or unaligned value. |
312 // if the user specified a smaller or unaligned value. |
313 size_t bounded_new_size = bound_minus_alignment(NewSize, MaxHeapSize); |
313 size_t bounded_new_size = bound_minus_alignment(NewSize, MaxHeapSize); |
314 bounded_new_size = MAX2(smallest_new_size, align_size_down(bounded_new_size, _gen_alignment)); |
314 bounded_new_size = MAX2(smallest_new_size, align_down(bounded_new_size, _gen_alignment)); |
315 if (bounded_new_size != NewSize) { |
315 if (bounded_new_size != NewSize) { |
316 FLAG_SET_ERGO(size_t, NewSize, bounded_new_size); |
316 FLAG_SET_ERGO(size_t, NewSize, bounded_new_size); |
317 } |
317 } |
318 _min_young_size = smallest_new_size; |
318 _min_young_size = smallest_new_size; |
319 _initial_young_size = NewSize; |
319 _initial_young_size = NewSize; |
332 FLAG_SET_ERGO(size_t, NewSize, MaxNewSize); |
332 FLAG_SET_ERGO(size_t, NewSize, MaxNewSize); |
333 _initial_young_size = NewSize; |
333 _initial_young_size = NewSize; |
334 } |
334 } |
335 } else if (MaxNewSize < _initial_young_size) { |
335 } else if (MaxNewSize < _initial_young_size) { |
336 FLAG_SET_ERGO(size_t, MaxNewSize, _initial_young_size); |
336 FLAG_SET_ERGO(size_t, MaxNewSize, _initial_young_size); |
337 } else if (!is_size_aligned(MaxNewSize, _gen_alignment)) { |
337 } else if (!is_aligned(MaxNewSize, _gen_alignment)) { |
338 FLAG_SET_ERGO(size_t, MaxNewSize, align_size_down(MaxNewSize, _gen_alignment)); |
338 FLAG_SET_ERGO(size_t, MaxNewSize, align_down(MaxNewSize, _gen_alignment)); |
339 } |
339 } |
340 _max_young_size = MaxNewSize; |
340 _max_young_size = MaxNewSize; |
341 } |
341 } |
342 |
342 |
343 if (NewSize > MaxNewSize) { |
343 if (NewSize > MaxNewSize) { |
357 } |
357 } |
358 |
358 |
359 if (OldSize < old_gen_size_lower_bound()) { |
359 if (OldSize < old_gen_size_lower_bound()) { |
360 FLAG_SET_ERGO(size_t, OldSize, old_gen_size_lower_bound()); |
360 FLAG_SET_ERGO(size_t, OldSize, old_gen_size_lower_bound()); |
361 } |
361 } |
362 if (!is_size_aligned(OldSize, _gen_alignment)) { |
362 if (!is_aligned(OldSize, _gen_alignment)) { |
363 FLAG_SET_ERGO(size_t, OldSize, align_size_down(OldSize, _gen_alignment)); |
363 FLAG_SET_ERGO(size_t, OldSize, align_down(OldSize, _gen_alignment)); |
364 } |
364 } |
365 |
365 |
366 if (FLAG_IS_CMDLINE(OldSize) && FLAG_IS_DEFAULT(MaxHeapSize)) { |
366 if (FLAG_IS_CMDLINE(OldSize) && FLAG_IS_DEFAULT(MaxHeapSize)) { |
367 // NewRatio will be used later to set the young generation size so we use |
367 // NewRatio will be used later to set the young generation size so we use |
368 // it to calculate how big the heap should be based on the requested OldSize |
368 // it to calculate how big the heap should be based on the requested OldSize |
369 // and NewRatio. |
369 // and NewRatio. |
370 assert(NewRatio > 0, "NewRatio should have been set up earlier"); |
370 assert(NewRatio > 0, "NewRatio should have been set up earlier"); |
371 size_t calculated_heapsize = (OldSize / NewRatio) * (NewRatio + 1); |
371 size_t calculated_heapsize = (OldSize / NewRatio) * (NewRatio + 1); |
372 |
372 |
373 calculated_heapsize = align_size_up(calculated_heapsize, _heap_alignment); |
373 calculated_heapsize = align_up(calculated_heapsize, _heap_alignment); |
374 FLAG_SET_ERGO(size_t, MaxHeapSize, calculated_heapsize); |
374 FLAG_SET_ERGO(size_t, MaxHeapSize, calculated_heapsize); |
375 _max_heap_byte_size = MaxHeapSize; |
375 _max_heap_byte_size = MaxHeapSize; |
376 FLAG_SET_ERGO(size_t, InitialHeapSize, calculated_heapsize); |
376 FLAG_SET_ERGO(size_t, InitialHeapSize, calculated_heapsize); |
377 _initial_heap_byte_size = InitialHeapSize; |
377 _initial_heap_byte_size = InitialHeapSize; |
378 } |
378 } |
382 if (FLAG_IS_CMDLINE(MaxHeapSize)) { |
382 if (FLAG_IS_CMDLINE(MaxHeapSize)) { |
383 // Somebody has set a maximum heap size with the intention that we should not |
383 // Somebody has set a maximum heap size with the intention that we should not |
384 // exceed it. Adjust New/OldSize as necessary. |
384 // exceed it. Adjust New/OldSize as necessary. |
385 size_t calculated_size = NewSize + OldSize; |
385 size_t calculated_size = NewSize + OldSize; |
386 double shrink_factor = (double) MaxHeapSize / calculated_size; |
386 double shrink_factor = (double) MaxHeapSize / calculated_size; |
387 size_t smaller_new_size = align_size_down((size_t)(NewSize * shrink_factor), _gen_alignment); |
387 size_t smaller_new_size = align_down((size_t)(NewSize * shrink_factor), _gen_alignment); |
388 FLAG_SET_ERGO(size_t, NewSize, MAX2(young_gen_size_lower_bound(), smaller_new_size)); |
388 FLAG_SET_ERGO(size_t, NewSize, MAX2(young_gen_size_lower_bound(), smaller_new_size)); |
389 _initial_young_size = NewSize; |
389 _initial_young_size = NewSize; |
390 |
390 |
391 // OldSize is already aligned because above we aligned MaxHeapSize to |
391 // OldSize is already aligned because above we aligned MaxHeapSize to |
392 // _heap_alignment, and we just made sure that NewSize is aligned to |
392 // _heap_alignment, and we just made sure that NewSize is aligned to |
393 // _gen_alignment. In initialize_flags() we verified that _heap_alignment |
393 // _gen_alignment. In initialize_flags() we verified that _heap_alignment |
394 // is a multiple of _gen_alignment. |
394 // is a multiple of _gen_alignment. |
395 FLAG_SET_ERGO(size_t, OldSize, MaxHeapSize - NewSize); |
395 FLAG_SET_ERGO(size_t, OldSize, MaxHeapSize - NewSize); |
396 } else { |
396 } else { |
397 FLAG_SET_ERGO(size_t, MaxHeapSize, align_size_up(NewSize + OldSize, _heap_alignment)); |
397 FLAG_SET_ERGO(size_t, MaxHeapSize, align_up(NewSize + OldSize, _heap_alignment)); |
398 _max_heap_byte_size = MaxHeapSize; |
398 _max_heap_byte_size = MaxHeapSize; |
399 } |
399 } |
400 } |
400 } |
401 |
401 |
402 // Update NewSize, if possible, to avoid sizing the young gen too small when only |
402 // Update NewSize, if possible, to avoid sizing the young gen too small when only |