Print this page
8236073: G1: Use SoftMaxHeapSize to guide GC heuristics

Split Close
Expand all
Collapse all
          --- old/src/hotspot/share/gc/g1/g1HeapSizingPolicy.cpp
          +++ new/src/hotspot/share/gc/g1/g1HeapSizingPolicy.cpp
↓ open down ↓ 18 lines elided ↑ open up ↑
  19   19   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20   20   * or visit www.oracle.com if you need additional information or have any
  21   21   * questions.
  22   22   *
  23   23   */
  24   24  
  25   25  #include "precompiled.hpp"
  26   26  #include "gc/g1/g1CollectedHeap.hpp"
  27   27  #include "gc/g1/g1HeapSizingPolicy.hpp"
  28   28  #include "gc/g1/g1Analytics.hpp"
       29 +#include "gc/g1/g1Policy.hpp"
  29   30  #include "logging/log.hpp"
  30   31  #include "runtime/globals.hpp"
  31   32  #include "utilities/debug.hpp"
  32   33  #include "utilities/globalDefinitions.hpp"
  33   34  
  34   35  G1HeapSizingPolicy* G1HeapSizingPolicy::create(const G1CollectedHeap* g1h, const G1Analytics* analytics) {
  35   36    return new G1HeapSizingPolicy(g1h, analytics);
  36   37  }
  37   38  
  38   39  G1HeapSizingPolicy::G1HeapSizingPolicy(const G1CollectedHeap* g1h, const G1Analytics* analytics) :
↓ open down ↓ 42 lines elided ↑ open up ↑
  81   82    // threshold to trigger an expansion. We'll also expand if we've
  82   83    // reached the end of the history buffer and the average of all entries
  83   84    // is still over the threshold. This indicates a smaller number of GCs were
  84   85    // long enough to make the average exceed the threshold.
  85   86    bool filled_history_buffer = _pauses_since_start == _num_prev_pauses_for_heuristics;
  86   87    if ((_ratio_over_threshold_count == MinOverThresholdForGrowth) ||
  87   88        (filled_history_buffer && (recent_gc_overhead > threshold))) {
  88   89      size_t min_expand_bytes = HeapRegion::GrainBytes;
  89   90      size_t reserved_bytes = _g1h->max_capacity();
  90   91      size_t committed_bytes = _g1h->capacity();
       92 +    if (committed_bytes <= SoftMaxHeapSize) {
       93 +      // Use SoftMaxHeapSize to limit the max size
       94 +      reserved_bytes = SoftMaxHeapSize;
       95 +    }
  91   96      size_t uncommitted_bytes = reserved_bytes - committed_bytes;
  92   97      size_t expand_bytes_via_pct =
  93   98        uncommitted_bytes * G1ExpandByPercentOfAvailable / 100;
  94   99      double scale_factor = 1.0;
  95  100  
  96  101      // If the current size is less than 1/4 of the Initial heap size, expand
  97  102      // by half of the delta between the current and Initial sizes. IE, grow
  98  103      // back quickly.
  99  104      //
 100  105      // Otherwise, take the current size, or G1ExpandByPercentOfAvailable % of
↓ open down ↓ 51 lines elided ↑ open up ↑
 152  157      // start again the next time we see a ratio above the threshold.
 153  158      if (_ratio_over_threshold_count > 0) {
 154  159        _pauses_since_start++;
 155  160        if (_pauses_since_start > _num_prev_pauses_for_heuristics) {
 156  161          clear_ratio_check_data();
 157  162        }
 158  163      }
 159  164    }
 160  165  
 161  166    return expand_bytes;
      167 +}
      168 +
      169 +bool G1HeapSizingPolicy::can_shrink_heap_size_to(size_t heap_size) {
      170 +  size_t cur_used_bytes = _g1h->non_young_capacity_bytes();
      171 +  uint used_regions = cur_used_bytes / HeapRegion::GrainBytes;
      172 +  uint new_number_of_regions = heap_size / HeapRegion::GrainBytes;
      173 +  // re-calculate the necessary reserve
      174 +  double reserve_regions_d = (double) new_number_of_regions * _g1h->policy()->_reserve_factor;
      175 +  // We use ceiling so that if reserve_regions_d is > 0.0 (but
      176 +  // smaller than 1.0) we'll get 1.
      177 +  uint reserve_regions = (uint) ceil(reserve_regions_d);
      178 +  if (new_number_of_regions <= (reserve_regions + used_regions)) {
      179 +    // No left for young generation
      180 +    return false;
      181 +  }
      182 +  // Rest region number for young gen
      183 +  uint young_regions = new_number_of_regions - reserve_regions - used_regions;
      184 +
      185 +  // re-calculate the young length
      186 +  uint min_young_length;
      187 +  uint max_young_length;
      188 +  _g1h->policy()->_young_gen_sizer->recalculate_min_max_young_length(new_number_of_regions,
      189 +                                                                     &min_young_length,
      190 +                                                                     &max_young_length);
      191 +  // Rest young region length must be larger than min young length
      192 +  return young_regions >= max_young_length;
 162  193  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX