hotspot/src/share/vm/gc/g1/g1CollectionSet.cpp
changeset 37262 e7b7bc691d7d
parent 37170 355117fc6eab
child 37985 539c597ee0fa
equal deleted inserted replaced
37261:659ed5b20b48 37262:e7b7bc691d7d
    57   _survivor_region_length(0),
    57   _survivor_region_length(0),
    58   _old_region_length(0),
    58   _old_region_length(0),
    59 
    59 
    60   _head(NULL),
    60   _head(NULL),
    61   _bytes_used_before(0),
    61   _bytes_used_before(0),
    62   _bytes_live_before(0),
       
    63   _recorded_rs_lengths(0),
    62   _recorded_rs_lengths(0),
    64   // Incremental CSet attributes
    63   // Incremental CSet attributes
    65   _inc_build_state(Inactive),
    64   _inc_build_state(Inactive),
    66   _inc_head(NULL),
    65   _inc_head(NULL),
    67   _inc_tail(NULL),
    66   _inc_tail(NULL),
    68   _inc_bytes_used_before(0),
    67   _inc_bytes_used_before(0),
    69   _inc_bytes_live_before(0),
       
    70   _inc_recorded_rs_lengths(0),
    68   _inc_recorded_rs_lengths(0),
    71   _inc_recorded_rs_lengths_diffs(0),
    69   _inc_recorded_rs_lengths_diffs(0),
    72   _inc_predicted_elapsed_time_ms(0.0),
    70   _inc_predicted_elapsed_time_ms(0.0),
    73   _inc_predicted_elapsed_time_ms_diffs(0.0) {}
    71   _inc_predicted_elapsed_time_ms_diffs(0.0) {}
    74 
    72 
    95   assert(!hr->in_collection_set(), "should not already be in the CSet");
    93   assert(!hr->in_collection_set(), "should not already be in the CSet");
    96   _g1->register_old_region_with_cset(hr);
    94   _g1->register_old_region_with_cset(hr);
    97   hr->set_next_in_collection_set(_head);
    95   hr->set_next_in_collection_set(_head);
    98   _head = hr;
    96   _head = hr;
    99   _bytes_used_before += hr->used();
    97   _bytes_used_before += hr->used();
   100   _bytes_live_before += hr->live_bytes();
       
   101   size_t rs_length = hr->rem_set()->occupied();
    98   size_t rs_length = hr->rem_set()->occupied();
   102   _recorded_rs_lengths += rs_length;
    99   _recorded_rs_lengths += rs_length;
   103   _old_region_length += 1;
   100   _old_region_length += 1;
   104 }
   101 }
   105 
   102 
   108   assert(_inc_build_state == Inactive, "Precondition");
   105   assert(_inc_build_state == Inactive, "Precondition");
   109 
   106 
   110   _inc_head = NULL;
   107   _inc_head = NULL;
   111   _inc_tail = NULL;
   108   _inc_tail = NULL;
   112   _inc_bytes_used_before = 0;
   109   _inc_bytes_used_before = 0;
   113   _inc_bytes_live_before = 0;
       
   114 
   110 
   115   _inc_recorded_rs_lengths = 0;
   111   _inc_recorded_rs_lengths = 0;
   116   _inc_recorded_rs_lengths_diffs = 0;
   112   _inc_recorded_rs_lengths_diffs = 0;
   117   _inc_predicted_elapsed_time_ms = 0.0;
   113   _inc_predicted_elapsed_time_ms = 0.0;
   118   _inc_predicted_elapsed_time_ms_diffs = 0.0;
   114   _inc_predicted_elapsed_time_ms_diffs = 0.0;
   211 
   207 
   212   size_t used_bytes = hr->used();
   208   size_t used_bytes = hr->used();
   213   _inc_recorded_rs_lengths += rs_length;
   209   _inc_recorded_rs_lengths += rs_length;
   214   _inc_predicted_elapsed_time_ms += region_elapsed_time_ms;
   210   _inc_predicted_elapsed_time_ms += region_elapsed_time_ms;
   215   _inc_bytes_used_before += used_bytes;
   211   _inc_bytes_used_before += used_bytes;
   216   _inc_bytes_live_before += hr->live_bytes();
       
   217 
   212 
   218   assert(!hr->in_collection_set(), "invariant");
   213   assert(!hr->in_collection_set(), "invariant");
   219   _g1->register_young_region_with_cset(hr);
   214   _g1->register_young_region_with_cset(hr);
   220   assert(hr->next_in_collection_set() == NULL, "invariant");
   215   assert(hr->next_in_collection_set() == NULL, "invariant");
   221 }
   216 }
   314   // Clear the fields that point to the survivor list - they are all young now.
   309   // Clear the fields that point to the survivor list - they are all young now.
   315   young_list->clear_survivors();
   310   young_list->clear_survivors();
   316 
   311 
   317   _head = _inc_head;
   312   _head = _inc_head;
   318   _bytes_used_before = _inc_bytes_used_before;
   313   _bytes_used_before = _inc_bytes_used_before;
   319   _bytes_live_before = _inc_bytes_live_before;
       
   320   time_remaining_ms = MAX2(time_remaining_ms - _inc_predicted_elapsed_time_ms, 0.0);
   314   time_remaining_ms = MAX2(time_remaining_ms - _inc_predicted_elapsed_time_ms, 0.0);
   321 
   315 
   322   log_trace(gc, ergo, cset)("Add young regions to CSet. eden: %u regions, survivors: %u regions, predicted young region time: %1.2fms, target pause time: %1.2fms",
   316   log_trace(gc, ergo, cset)("Add young regions to CSet. eden: %u regions, survivors: %u regions, predicted young region time: %1.2fms, target pause time: %1.2fms",
   323                             eden_region_length, survivor_region_length, _inc_predicted_elapsed_time_ms, target_pause_time_ms);
   317                             eden_region_length, survivor_region_length, _inc_predicted_elapsed_time_ms, target_pause_time_ms);
   324 
   318 
   338 
   332 
   339   if (!collector_state()->gcs_are_young()) {
   333   if (!collector_state()->gcs_are_young()) {
   340     cset_chooser()->verify();
   334     cset_chooser()->verify();
   341     const uint min_old_cset_length = _policy->calc_min_old_cset_length();
   335     const uint min_old_cset_length = _policy->calc_min_old_cset_length();
   342     const uint max_old_cset_length = _policy->calc_max_old_cset_length();
   336     const uint max_old_cset_length = _policy->calc_max_old_cset_length();
   343     const size_t estimated_available_bytes = _policy->available_bytes_estimate();
       
   344 
   337 
   345     uint expensive_region_num = 0;
   338     uint expensive_region_num = 0;
   346     bool check_time_remaining = _policy->adaptive_young_list_length();
   339     bool check_time_remaining = _policy->adaptive_young_list_length();
   347 
   340 
   348     HeapRegion* hr = cset_chooser()->peek();
   341     HeapRegion* hr = cset_chooser()->peek();
   367                                   "old %u regions, max %u regions, reclaimable: " SIZE_FORMAT "B (%1.2f%%) threshold: " UINTX_FORMAT "%%",
   360                                   "old %u regions, max %u regions, reclaimable: " SIZE_FORMAT "B (%1.2f%%) threshold: " UINTX_FORMAT "%%",
   368                                   old_region_length(), max_old_cset_length, reclaimable_bytes, reclaimable_perc, G1HeapWastePercent);
   361                                   old_region_length(), max_old_cset_length, reclaimable_bytes, reclaimable_perc, G1HeapWastePercent);
   369         break;
   362         break;
   370       }
   363       }
   371 
   364 
   372       // Stop adding regions if the live bytes (according to the last marking)
       
   373       // added so far would exceed the estimated free bytes.
       
   374       if ((_bytes_live_before + hr->live_bytes()) > estimated_available_bytes) {
       
   375         log_debug(gc, ergo, cset)("Finish adding old regions to CSet (reached estimated free space limit)");
       
   376         break;
       
   377       }
       
   378 
       
   379       double predicted_time_ms = predict_region_elapsed_time_ms(hr);
   365       double predicted_time_ms = predict_region_elapsed_time_ms(hr);
   380       if (check_time_remaining) {
   366       if (check_time_remaining) {
   381         if (predicted_time_ms > time_remaining_ms) {
   367         if (predicted_time_ms > time_remaining_ms) {
   382           // Too expensive for the current CSet.
   368           // Too expensive for the current CSet.
   383 
   369