hotspot/src/share/vm/gc/shared/collectorPolicy.cpp
changeset 46619 a3919f5e8d2b
parent 46618 d503911aa948
child 46625 edefffab74e2
equal deleted inserted replaced
46618:d503911aa948 46619:a3919f5e8d2b
   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