src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp

changeset 6085
8f07aa079343
parent 6082
4288e54fd145
child 6609
270d7cb38f40
     1.1 --- a/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp	Mon Oct 21 18:56:20 2013 +0200
     1.2 +++ b/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp	Fri Nov 01 17:09:38 2013 +0100
     1.3 @@ -313,27 +313,38 @@
     1.4    // for the first time during initialization.
     1.5    _reserve_regions = 0;
     1.6  
     1.7 -  initialize_all();
     1.8    _collectionSetChooser = new CollectionSetChooser();
     1.9 -  _young_gen_sizer = new G1YoungGenSizer(); // Must be after call to initialize_flags
    1.10 +}
    1.11 +
    1.12 +void G1CollectorPolicy::initialize_alignments() {
    1.13 +  _space_alignment = HeapRegion::GrainBytes;
    1.14 +  size_t card_table_alignment = GenRemSet::max_alignment_constraint(GenRemSet::CardTable);
    1.15 +  size_t page_size = UseLargePages ? os::large_page_size() : os::vm_page_size();
    1.16 +  _heap_alignment = MAX3(card_table_alignment, _space_alignment, page_size);
    1.17  }
    1.18  
    1.19  void G1CollectorPolicy::initialize_flags() {
    1.20 -  _min_alignment = HeapRegion::GrainBytes;
    1.21 -  size_t card_table_alignment = GenRemSet::max_alignment_constraint(GenRemSet::CardTable);
    1.22 -  size_t page_size = UseLargePages ? os::large_page_size() : os::vm_page_size();
    1.23 -  _max_alignment = MAX3(card_table_alignment, _min_alignment, page_size);
    1.24 +  if (G1HeapRegionSize != HeapRegion::GrainBytes) {
    1.25 +    FLAG_SET_ERGO(uintx, G1HeapRegionSize, HeapRegion::GrainBytes);
    1.26 +  }
    1.27 +
    1.28    if (SurvivorRatio < 1) {
    1.29      vm_exit_during_initialization("Invalid survivor ratio specified");
    1.30    }
    1.31    CollectorPolicy::initialize_flags();
    1.32 +  _young_gen_sizer = new G1YoungGenSizer(); // Must be after call to initialize_flags
    1.33  }
    1.34  
    1.35 -G1YoungGenSizer::G1YoungGenSizer() : _sizer_kind(SizerDefaults), _adaptive_size(true) {
    1.36 -  assert(G1NewSizePercent <= G1MaxNewSizePercent, "Min larger than max");
    1.37 -  assert(G1NewSizePercent > 0 && G1NewSizePercent < 100, "Min out of bounds");
    1.38 -  assert(G1MaxNewSizePercent > 0 && G1MaxNewSizePercent < 100, "Max out of bounds");
    1.39 +void G1CollectorPolicy::post_heap_initialize() {
    1.40 +  uintx max_regions = G1CollectedHeap::heap()->max_regions();
    1.41 +  size_t max_young_size = (size_t)_young_gen_sizer->max_young_length(max_regions) * HeapRegion::GrainBytes;
    1.42 +  if (max_young_size != MaxNewSize) {
    1.43 +    FLAG_SET_ERGO(uintx, MaxNewSize, max_young_size);
    1.44 +  }
    1.45 +}
    1.46  
    1.47 +G1YoungGenSizer::G1YoungGenSizer() : _sizer_kind(SizerDefaults), _adaptive_size(true),
    1.48 +        _min_desired_young_length(0), _max_desired_young_length(0) {
    1.49    if (FLAG_IS_CMDLINE(NewRatio)) {
    1.50      if (FLAG_IS_CMDLINE(NewSize) || FLAG_IS_CMDLINE(MaxNewSize)) {
    1.51        warning("-XX:NewSize and -XX:MaxNewSize override -XX:NewRatio");
    1.52 @@ -344,8 +355,13 @@
    1.53      }
    1.54    }
    1.55  
    1.56 -  if (FLAG_IS_CMDLINE(NewSize) && FLAG_IS_CMDLINE(MaxNewSize) && NewSize > MaxNewSize) {
    1.57 -    vm_exit_during_initialization("Initial young gen size set larger than the maximum young gen size");
    1.58 +  if (NewSize > MaxNewSize) {
    1.59 +    if (FLAG_IS_CMDLINE(MaxNewSize)) {
    1.60 +      warning("NewSize (" SIZE_FORMAT "k) is greater than the MaxNewSize (" SIZE_FORMAT "k). "
    1.61 +              "A new max generation size of " SIZE_FORMAT "k will be used.",
    1.62 +              NewSize/K, MaxNewSize/K, NewSize/K);
    1.63 +    }
    1.64 +    MaxNewSize = NewSize;
    1.65    }
    1.66  
    1.67    if (FLAG_IS_CMDLINE(NewSize)) {
    1.68 @@ -378,34 +394,48 @@
    1.69    return MAX2(1U, default_value);
    1.70  }
    1.71  
    1.72 -void G1YoungGenSizer::heap_size_changed(uint new_number_of_heap_regions) {
    1.73 -  assert(new_number_of_heap_regions > 0, "Heap must be initialized");
    1.74 +void G1YoungGenSizer::recalculate_min_max_young_length(uint number_of_heap_regions, uint* min_young_length, uint* max_young_length) {
    1.75 +  assert(number_of_heap_regions > 0, "Heap must be initialized");
    1.76  
    1.77    switch (_sizer_kind) {
    1.78      case SizerDefaults:
    1.79 -      _min_desired_young_length = calculate_default_min_length(new_number_of_heap_regions);
    1.80 -      _max_desired_young_length = calculate_default_max_length(new_number_of_heap_regions);
    1.81 +      *min_young_length = calculate_default_min_length(number_of_heap_regions);
    1.82 +      *max_young_length = calculate_default_max_length(number_of_heap_regions);
    1.83        break;
    1.84      case SizerNewSizeOnly:
    1.85 -      _max_desired_young_length = calculate_default_max_length(new_number_of_heap_regions);
    1.86 -      _max_desired_young_length = MAX2(_min_desired_young_length, _max_desired_young_length);
    1.87 +      *max_young_length = calculate_default_max_length(number_of_heap_regions);
    1.88 +      *max_young_length = MAX2(*min_young_length, *max_young_length);
    1.89        break;
    1.90      case SizerMaxNewSizeOnly:
    1.91 -      _min_desired_young_length = calculate_default_min_length(new_number_of_heap_regions);
    1.92 -      _min_desired_young_length = MIN2(_min_desired_young_length, _max_desired_young_length);
    1.93 +      *min_young_length = calculate_default_min_length(number_of_heap_regions);
    1.94 +      *min_young_length = MIN2(*min_young_length, *max_young_length);
    1.95        break;
    1.96      case SizerMaxAndNewSize:
    1.97        // Do nothing. Values set on the command line, don't update them at runtime.
    1.98        break;
    1.99      case SizerNewRatio:
   1.100 -      _min_desired_young_length = new_number_of_heap_regions / (NewRatio + 1);
   1.101 -      _max_desired_young_length = _min_desired_young_length;
   1.102 +      *min_young_length = number_of_heap_regions / (NewRatio + 1);
   1.103 +      *max_young_length = *min_young_length;
   1.104        break;
   1.105      default:
   1.106        ShouldNotReachHere();
   1.107    }
   1.108  
   1.109 -  assert(_min_desired_young_length <= _max_desired_young_length, "Invalid min/max young gen size values");
   1.110 +  assert(*min_young_length <= *max_young_length, "Invalid min/max young gen size values");
   1.111 +}
   1.112 +
   1.113 +uint G1YoungGenSizer::max_young_length(uint number_of_heap_regions) {
   1.114 +  // We need to pass the desired values because recalculation may not update these
   1.115 +  // values in some cases.
   1.116 +  uint temp = _min_desired_young_length;
   1.117 +  uint result = _max_desired_young_length;
   1.118 +  recalculate_min_max_young_length(number_of_heap_regions, &temp, &result);
   1.119 +  return result;
   1.120 +}
   1.121 +
   1.122 +void G1YoungGenSizer::heap_size_changed(uint new_number_of_heap_regions) {
   1.123 +  recalculate_min_max_young_length(new_number_of_heap_regions, &_min_desired_young_length,
   1.124 +          &_max_desired_young_length);
   1.125  }
   1.126  
   1.127  void G1CollectorPolicy::init() {

mercurial