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() {