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

changeset 3713
720b6a76dd9d
parent 3710
5c86f8211d1e
child 3714
f7a8920427a6
     1.1 --- a/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp	Wed Apr 11 16:18:45 2012 +0200
     1.2 +++ b/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp	Wed Apr 18 07:21:15 2012 -0400
     1.3 @@ -431,31 +431,36 @@
     1.4    }
     1.5  
     1.6    if (FLAG_IS_CMDLINE(NewSize)) {
     1.7 -     _min_desired_young_length = MAX2((size_t) 1, NewSize / HeapRegion::GrainBytes);
     1.8 +    _min_desired_young_length = MAX2((uint) (NewSize / HeapRegion::GrainBytes),
     1.9 +                                     1U);
    1.10      if (FLAG_IS_CMDLINE(MaxNewSize)) {
    1.11 -      _max_desired_young_length = MAX2((size_t) 1, MaxNewSize / HeapRegion::GrainBytes);
    1.12 +      _max_desired_young_length =
    1.13 +                             MAX2((uint) (MaxNewSize / HeapRegion::GrainBytes),
    1.14 +                                  1U);
    1.15        _sizer_kind = SizerMaxAndNewSize;
    1.16        _adaptive_size = _min_desired_young_length == _max_desired_young_length;
    1.17      } else {
    1.18        _sizer_kind = SizerNewSizeOnly;
    1.19      }
    1.20    } else if (FLAG_IS_CMDLINE(MaxNewSize)) {
    1.21 -    _max_desired_young_length = MAX2((size_t) 1, MaxNewSize / HeapRegion::GrainBytes);
    1.22 +    _max_desired_young_length =
    1.23 +                             MAX2((uint) (MaxNewSize / HeapRegion::GrainBytes),
    1.24 +                                  1U);
    1.25      _sizer_kind = SizerMaxNewSizeOnly;
    1.26    }
    1.27  }
    1.28  
    1.29 -size_t G1YoungGenSizer::calculate_default_min_length(size_t new_number_of_heap_regions) {
    1.30 -  size_t default_value = (new_number_of_heap_regions * G1DefaultMinNewGenPercent) / 100;
    1.31 -  return MAX2((size_t)1, default_value);
    1.32 +uint G1YoungGenSizer::calculate_default_min_length(uint new_number_of_heap_regions) {
    1.33 +  uint default_value = (new_number_of_heap_regions * G1DefaultMinNewGenPercent) / 100;
    1.34 +  return MAX2(1U, default_value);
    1.35  }
    1.36  
    1.37 -size_t G1YoungGenSizer::calculate_default_max_length(size_t new_number_of_heap_regions) {
    1.38 -  size_t default_value = (new_number_of_heap_regions * G1DefaultMaxNewGenPercent) / 100;
    1.39 -  return MAX2((size_t)1, default_value);
    1.40 +uint G1YoungGenSizer::calculate_default_max_length(uint new_number_of_heap_regions) {
    1.41 +  uint default_value = (new_number_of_heap_regions * G1DefaultMaxNewGenPercent) / 100;
    1.42 +  return MAX2(1U, default_value);
    1.43  }
    1.44  
    1.45 -void G1YoungGenSizer::heap_size_changed(size_t new_number_of_heap_regions) {
    1.46 +void G1YoungGenSizer::heap_size_changed(uint new_number_of_heap_regions) {
    1.47    assert(new_number_of_heap_regions > 0, "Heap must be initialized");
    1.48  
    1.49    switch (_sizer_kind) {
    1.50 @@ -512,16 +517,16 @@
    1.51    _gc_policy_counters = new GCPolicyCounters("GarbageFirst", 1, 3);
    1.52  }
    1.53  
    1.54 -bool G1CollectorPolicy::predict_will_fit(size_t young_length,
    1.55 +bool G1CollectorPolicy::predict_will_fit(uint young_length,
    1.56                                           double base_time_ms,
    1.57 -                                         size_t base_free_regions,
    1.58 +                                         uint base_free_regions,
    1.59                                           double target_pause_time_ms) {
    1.60    if (young_length >= base_free_regions) {
    1.61      // end condition 1: not enough space for the young regions
    1.62      return false;
    1.63    }
    1.64  
    1.65 -  double accum_surv_rate = accum_yg_surv_rate_pred((int)(young_length - 1));
    1.66 +  double accum_surv_rate = accum_yg_surv_rate_pred((int) young_length - 1);
    1.67    size_t bytes_to_copy =
    1.68                 (size_t) (accum_surv_rate * (double) HeapRegion::GrainBytes);
    1.69    double copy_time_ms = predict_object_copy_time_ms(bytes_to_copy);
    1.70 @@ -533,7 +538,7 @@
    1.71    }
    1.72  
    1.73    size_t free_bytes =
    1.74 -                  (base_free_regions - young_length) * HeapRegion::GrainBytes;
    1.75 +                   (base_free_regions - young_length) * HeapRegion::GrainBytes;
    1.76    if ((2.0 * sigma()) * (double) bytes_to_copy > (double) free_bytes) {
    1.77      // end condition 3: out-of-space (conservatively!)
    1.78      return false;
    1.79 @@ -543,25 +548,25 @@
    1.80    return true;
    1.81  }
    1.82  
    1.83 -void G1CollectorPolicy::record_new_heap_size(size_t new_number_of_regions) {
    1.84 +void G1CollectorPolicy::record_new_heap_size(uint new_number_of_regions) {
    1.85    // re-calculate the necessary reserve
    1.86    double reserve_regions_d = (double) new_number_of_regions * _reserve_factor;
    1.87    // We use ceiling so that if reserve_regions_d is > 0.0 (but
    1.88    // smaller than 1.0) we'll get 1.
    1.89 -  _reserve_regions = (size_t) ceil(reserve_regions_d);
    1.90 +  _reserve_regions = (uint) ceil(reserve_regions_d);
    1.91  
    1.92    _young_gen_sizer->heap_size_changed(new_number_of_regions);
    1.93  }
    1.94  
    1.95 -size_t G1CollectorPolicy::calculate_young_list_desired_min_length(
    1.96 -                                                     size_t base_min_length) {
    1.97 -  size_t desired_min_length = 0;
    1.98 +uint G1CollectorPolicy::calculate_young_list_desired_min_length(
    1.99 +                                                       uint base_min_length) {
   1.100 +  uint desired_min_length = 0;
   1.101    if (adaptive_young_list_length()) {
   1.102      if (_alloc_rate_ms_seq->num() > 3) {
   1.103        double now_sec = os::elapsedTime();
   1.104        double when_ms = _mmu_tracker->when_max_gc_sec(now_sec) * 1000.0;
   1.105        double alloc_rate_ms = predict_alloc_rate_ms();
   1.106 -      desired_min_length = (size_t) ceil(alloc_rate_ms * when_ms);
   1.107 +      desired_min_length = (uint) ceil(alloc_rate_ms * when_ms);
   1.108      } else {
   1.109        // otherwise we don't have enough info to make the prediction
   1.110      }
   1.111 @@ -571,7 +576,7 @@
   1.112    return MAX2(_young_gen_sizer->min_desired_young_length(), desired_min_length);
   1.113  }
   1.114  
   1.115 -size_t G1CollectorPolicy::calculate_young_list_desired_max_length() {
   1.116 +uint G1CollectorPolicy::calculate_young_list_desired_max_length() {
   1.117    // Here, we might want to also take into account any additional
   1.118    // constraints (i.e., user-defined minimum bound). Currently, we
   1.119    // effectively don't set this bound.
   1.120 @@ -588,11 +593,11 @@
   1.121    // Calculate the absolute and desired min bounds.
   1.122  
   1.123    // This is how many young regions we already have (currently: the survivors).
   1.124 -  size_t base_min_length = recorded_survivor_regions();
   1.125 +  uint base_min_length = recorded_survivor_regions();
   1.126    // This is the absolute minimum young length, which ensures that we
   1.127    // can allocate one eden region in the worst-case.
   1.128 -  size_t absolute_min_length = base_min_length + 1;
   1.129 -  size_t desired_min_length =
   1.130 +  uint absolute_min_length = base_min_length + 1;
   1.131 +  uint desired_min_length =
   1.132                       calculate_young_list_desired_min_length(base_min_length);
   1.133    if (desired_min_length < absolute_min_length) {
   1.134      desired_min_length = absolute_min_length;
   1.135 @@ -601,16 +606,16 @@
   1.136    // Calculate the absolute and desired max bounds.
   1.137  
   1.138    // We will try our best not to "eat" into the reserve.
   1.139 -  size_t absolute_max_length = 0;
   1.140 +  uint absolute_max_length = 0;
   1.141    if (_free_regions_at_end_of_collection > _reserve_regions) {
   1.142      absolute_max_length = _free_regions_at_end_of_collection - _reserve_regions;
   1.143    }
   1.144 -  size_t desired_max_length = calculate_young_list_desired_max_length();
   1.145 +  uint desired_max_length = calculate_young_list_desired_max_length();
   1.146    if (desired_max_length > absolute_max_length) {
   1.147      desired_max_length = absolute_max_length;
   1.148    }
   1.149  
   1.150 -  size_t young_list_target_length = 0;
   1.151 +  uint young_list_target_length = 0;
   1.152    if (adaptive_young_list_length()) {
   1.153      if (gcs_are_young()) {
   1.154        young_list_target_length =
   1.155 @@ -648,11 +653,11 @@
   1.156    update_max_gc_locker_expansion();
   1.157  }
   1.158  
   1.159 -size_t
   1.160 +uint
   1.161  G1CollectorPolicy::calculate_young_list_target_length(size_t rs_lengths,
   1.162 -                                                   size_t base_min_length,
   1.163 -                                                   size_t desired_min_length,
   1.164 -                                                   size_t desired_max_length) {
   1.165 +                                                     uint base_min_length,
   1.166 +                                                     uint desired_min_length,
   1.167 +                                                     uint desired_max_length) {
   1.168    assert(adaptive_young_list_length(), "pre-condition");
   1.169    assert(gcs_are_young(), "only call this for young GCs");
   1.170  
   1.171 @@ -667,9 +672,9 @@
   1.172    // will be reflected in the predictions by the
   1.173    // survivor_regions_evac_time prediction.
   1.174    assert(desired_min_length > base_min_length, "invariant");
   1.175 -  size_t min_young_length = desired_min_length - base_min_length;
   1.176 +  uint min_young_length = desired_min_length - base_min_length;
   1.177    assert(desired_max_length > base_min_length, "invariant");
   1.178 -  size_t max_young_length = desired_max_length - base_min_length;
   1.179 +  uint max_young_length = desired_max_length - base_min_length;
   1.180  
   1.181    double target_pause_time_ms = _mmu_tracker->max_gc_time() * 1000.0;
   1.182    double survivor_regions_evac_time = predict_survivor_regions_evac_time();
   1.183 @@ -679,8 +684,8 @@
   1.184    double base_time_ms =
   1.185      predict_base_elapsed_time_ms(pending_cards, scanned_cards) +
   1.186      survivor_regions_evac_time;
   1.187 -  size_t available_free_regions = _free_regions_at_end_of_collection;
   1.188 -  size_t base_free_regions = 0;
   1.189 +  uint available_free_regions = _free_regions_at_end_of_collection;
   1.190 +  uint base_free_regions = 0;
   1.191    if (available_free_regions > _reserve_regions) {
   1.192      base_free_regions = available_free_regions - _reserve_regions;
   1.193    }
   1.194 @@ -717,9 +722,9 @@
   1.195        // the new max. This way we maintain the loop invariants.
   1.196  
   1.197        assert(min_young_length < max_young_length, "invariant");
   1.198 -      size_t diff = (max_young_length - min_young_length) / 2;
   1.199 +      uint diff = (max_young_length - min_young_length) / 2;
   1.200        while (diff > 0) {
   1.201 -        size_t young_length = min_young_length + diff;
   1.202 +        uint young_length = min_young_length + diff;
   1.203          if (predict_will_fit(young_length, base_time_ms,
   1.204                               base_free_regions, target_pause_time_ms)) {
   1.205            min_young_length = young_length;
   1.206 @@ -1322,7 +1327,7 @@
   1.207      // given that humongous object allocations do not really affect
   1.208      // either the pause's duration nor when the next pause will take
   1.209      // place we can safely ignore them here.
   1.210 -    size_t regions_allocated = eden_cset_region_length();
   1.211 +    uint regions_allocated = eden_cset_region_length();
   1.212      double alloc_rate_ms = (double) regions_allocated / app_time_ms;
   1.213      _alloc_rate_ms_seq->add(alloc_rate_ms);
   1.214  
   1.215 @@ -1506,8 +1511,9 @@
   1.216      double pause_time_ms = elapsed_ms;
   1.217  
   1.218      size_t diff = 0;
   1.219 -    if (_max_pending_cards >= _pending_cards)
   1.220 +    if (_max_pending_cards >= _pending_cards) {
   1.221        diff = _max_pending_cards - _pending_cards;
   1.222 +    }
   1.223      _pending_card_diff_seq->add((double) diff);
   1.224  
   1.225      double cost_per_card_ms = 0.0;
   1.226 @@ -1741,8 +1747,7 @@
   1.227    return region_elapsed_time_ms;
   1.228  }
   1.229  
   1.230 -size_t
   1.231 -G1CollectorPolicy::predict_bytes_to_copy(HeapRegion* hr) {
   1.232 +size_t G1CollectorPolicy::predict_bytes_to_copy(HeapRegion* hr) {
   1.233    size_t bytes_to_copy;
   1.234    if (hr->is_marked())
   1.235      bytes_to_copy = hr->max_live_bytes();
   1.236 @@ -1756,8 +1761,8 @@
   1.237  }
   1.238  
   1.239  void
   1.240 -G1CollectorPolicy::init_cset_region_lengths(size_t eden_cset_region_length,
   1.241 -                                          size_t survivor_cset_region_length) {
   1.242 +G1CollectorPolicy::init_cset_region_lengths(uint eden_cset_region_length,
   1.243 +                                            uint survivor_cset_region_length) {
   1.244    _eden_cset_region_length     = eden_cset_region_length;
   1.245    _survivor_cset_region_length = survivor_cset_region_length;
   1.246    _old_cset_region_length      = 0;
   1.247 @@ -2021,7 +2026,7 @@
   1.248  }
   1.249  #endif // PRODUCT
   1.250  
   1.251 -size_t G1CollectorPolicy::max_regions(int purpose) {
   1.252 +uint G1CollectorPolicy::max_regions(int purpose) {
   1.253    switch (purpose) {
   1.254      case GCAllocForSurvived:
   1.255        return _max_survivor_regions;
   1.256 @@ -2034,13 +2039,13 @@
   1.257  }
   1.258  
   1.259  void G1CollectorPolicy::update_max_gc_locker_expansion() {
   1.260 -  size_t expansion_region_num = 0;
   1.261 +  uint expansion_region_num = 0;
   1.262    if (GCLockerEdenExpansionPercent > 0) {
   1.263      double perc = (double) GCLockerEdenExpansionPercent / 100.0;
   1.264      double expansion_region_num_d = perc * (double) _young_list_target_length;
   1.265      // We use ceiling so that if expansion_region_num_d is > 0.0 (but
   1.266      // less than 1.0) we'll get 1.
   1.267 -    expansion_region_num = (size_t) ceil(expansion_region_num_d);
   1.268 +    expansion_region_num = (uint) ceil(expansion_region_num_d);
   1.269    } else {
   1.270      assert(expansion_region_num == 0, "sanity");
   1.271    }
   1.272 @@ -2054,7 +2059,7 @@
   1.273                   (double) _young_list_target_length / (double) SurvivorRatio;
   1.274    // We use ceiling so that if max_survivor_regions_d is > 0.0 (but
   1.275    // smaller than 1.0) we'll get 1.
   1.276 -  _max_survivor_regions = (size_t) ceil(max_survivor_regions_d);
   1.277 +  _max_survivor_regions = (uint) ceil(max_survivor_regions_d);
   1.278  
   1.279    _tenuring_threshold = _survivors_age_table.compute_tenuring_threshold(
   1.280          HeapRegion::GrainWords * _max_survivor_regions);
   1.281 @@ -2288,27 +2293,25 @@
   1.282                             (clear_marked_end_sec - start_sec) * 1000.0);
   1.283    }
   1.284  
   1.285 +  uint region_num = _g1->n_regions();
   1.286    if (G1CollectedHeap::use_parallel_gc_threads()) {
   1.287 -    const size_t OverpartitionFactor = 4;
   1.288 -    size_t WorkUnit;
   1.289 +    const uint OverpartitionFactor = 4;
   1.290 +    uint WorkUnit;
   1.291      // The use of MinChunkSize = 8 in the original code
   1.292      // causes some assertion failures when the total number of
   1.293      // region is less than 8.  The code here tries to fix that.
   1.294      // Should the original code also be fixed?
   1.295      if (no_of_gc_threads > 0) {
   1.296 -      const size_t MinWorkUnit =
   1.297 -        MAX2(_g1->n_regions() / no_of_gc_threads, (size_t) 1U);
   1.298 -      WorkUnit =
   1.299 -        MAX2(_g1->n_regions() / (no_of_gc_threads * OverpartitionFactor),
   1.300 -             MinWorkUnit);
   1.301 +      const uint MinWorkUnit = MAX2(region_num / no_of_gc_threads, 1U);
   1.302 +      WorkUnit = MAX2(region_num / (no_of_gc_threads * OverpartitionFactor),
   1.303 +                      MinWorkUnit);
   1.304      } else {
   1.305        assert(no_of_gc_threads > 0,
   1.306          "The active gc workers should be greater than 0");
   1.307        // In a product build do something reasonable to avoid a crash.
   1.308 -      const size_t MinWorkUnit =
   1.309 -        MAX2(_g1->n_regions() / ParallelGCThreads, (size_t) 1U);
   1.310 +      const uint MinWorkUnit = MAX2(region_num / (uint) ParallelGCThreads, 1U);
   1.311        WorkUnit =
   1.312 -        MAX2(_g1->n_regions() / (ParallelGCThreads * OverpartitionFactor),
   1.313 +        MAX2(region_num / (uint) (ParallelGCThreads * OverpartitionFactor),
   1.314               MinWorkUnit);
   1.315      }
   1.316      _collectionSetChooser->prepareForAddMarkedHeapRegionsPar(_g1->n_regions(),
   1.317 @@ -2624,8 +2627,8 @@
   1.318    // pause are appended to the RHS of the young list, i.e.
   1.319    //   [Newly Young Regions ++ Survivors from last pause].
   1.320  
   1.321 -  size_t survivor_region_length = young_list->survivor_length();
   1.322 -  size_t eden_region_length = young_list->length() - survivor_region_length;
   1.323 +  uint survivor_region_length = young_list->survivor_length();
   1.324 +  uint eden_region_length = young_list->length() - survivor_region_length;
   1.325    init_cset_region_lengths(eden_region_length, survivor_region_length);
   1.326    hr = young_list->first_survivor_region();
   1.327    while (hr != NULL) {
   1.328 @@ -2664,10 +2667,10 @@
   1.329    if (!gcs_are_young()) {
   1.330      CollectionSetChooser* cset_chooser = _collectionSetChooser;
   1.331      assert(cset_chooser->verify(), "CSet Chooser verification - pre");
   1.332 -    const size_t min_old_cset_length = cset_chooser->calcMinOldCSetLength();
   1.333 -    const size_t max_old_cset_length = cset_chooser->calcMaxOldCSetLength();
   1.334 -
   1.335 -    size_t expensive_region_num = 0;
   1.336 +    const uint min_old_cset_length = cset_chooser->calcMinOldCSetLength();
   1.337 +    const uint max_old_cset_length = cset_chooser->calcMaxOldCSetLength();
   1.338 +
   1.339 +    uint expensive_region_num = 0;
   1.340      bool check_time_remaining = adaptive_young_list_length();
   1.341      HeapRegion* hr = cset_chooser->peek();
   1.342      while (hr != NULL) {

mercurial