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

Thu, 17 Nov 2011 12:40:15 -0800

author
johnc
date
Thu, 17 Nov 2011 12:40:15 -0800
changeset 3296
dc467e8b2c5e
parent 3295
00dd86e542eb
child 3326
d23d2b18183e
permissions
-rw-r--r--

7112743: G1: Reduce overhead of marking closure during evacuation pauses
Summary: Parallelize the serial code that was used to mark objects reachable from survivor objects in the collection set. Some minor improvments in the timers used to track the freeing of the collection set along with some tweaks to PrintGCDetails.
Reviewed-by: tonyp, brutisso

     1 /*
     2  * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  *
    23  */
    25 #include "precompiled.hpp"
    26 #include "gc_implementation/g1/concurrentG1Refine.hpp"
    27 #include "gc_implementation/g1/concurrentMark.hpp"
    28 #include "gc_implementation/g1/concurrentMarkThread.inline.hpp"
    29 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
    30 #include "gc_implementation/g1/g1CollectorPolicy.hpp"
    31 #include "gc_implementation/g1/g1ErgoVerbose.hpp"
    32 #include "gc_implementation/g1/heapRegionRemSet.hpp"
    33 #include "gc_implementation/shared/gcPolicyCounters.hpp"
    34 #include "runtime/arguments.hpp"
    35 #include "runtime/java.hpp"
    36 #include "runtime/mutexLocker.hpp"
    37 #include "utilities/debug.hpp"
    39 // Different defaults for different number of GC threads
    40 // They were chosen by running GCOld and SPECjbb on debris with different
    41 //   numbers of GC threads and choosing them based on the results
    43 // all the same
    44 static double rs_length_diff_defaults[] = {
    45   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
    46 };
    48 static double cost_per_card_ms_defaults[] = {
    49   0.01, 0.005, 0.005, 0.003, 0.003, 0.002, 0.002, 0.0015
    50 };
    52 // all the same
    53 static double fully_young_cards_per_entry_ratio_defaults[] = {
    54   1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0
    55 };
    57 static double cost_per_entry_ms_defaults[] = {
    58   0.015, 0.01, 0.01, 0.008, 0.008, 0.0055, 0.0055, 0.005
    59 };
    61 static double cost_per_byte_ms_defaults[] = {
    62   0.00006, 0.00003, 0.00003, 0.000015, 0.000015, 0.00001, 0.00001, 0.000009
    63 };
    65 // these should be pretty consistent
    66 static double constant_other_time_ms_defaults[] = {
    67   5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0
    68 };
    71 static double young_other_cost_per_region_ms_defaults[] = {
    72   0.3, 0.2, 0.2, 0.15, 0.15, 0.12, 0.12, 0.1
    73 };
    75 static double non_young_other_cost_per_region_ms_defaults[] = {
    76   1.0, 0.7, 0.7, 0.5, 0.5, 0.42, 0.42, 0.30
    77 };
    79 // Help class for avoiding interleaved logging
    80 class LineBuffer: public StackObj {
    82 private:
    83   static const int BUFFER_LEN = 1024;
    84   static const int INDENT_CHARS = 3;
    85   char _buffer[BUFFER_LEN];
    86   int _indent_level;
    87   int _cur;
    89   void vappend(const char* format, va_list ap) {
    90     int res = vsnprintf(&_buffer[_cur], BUFFER_LEN - _cur, format, ap);
    91     if (res != -1) {
    92       _cur += res;
    93     } else {
    94       DEBUG_ONLY(warning("buffer too small in LineBuffer");)
    95       _buffer[BUFFER_LEN -1] = 0;
    96       _cur = BUFFER_LEN; // vsnprintf above should not add to _buffer if we are called again
    97     }
    98   }
   100 public:
   101   explicit LineBuffer(int indent_level): _indent_level(indent_level), _cur(0) {
   102     for (; (_cur < BUFFER_LEN && _cur < (_indent_level * INDENT_CHARS)); _cur++) {
   103       _buffer[_cur] = ' ';
   104     }
   105   }
   107 #ifndef PRODUCT
   108   ~LineBuffer() {
   109     assert(_cur == _indent_level * INDENT_CHARS, "pending data in buffer - append_and_print_cr() not called?");
   110   }
   111 #endif
   113   void append(const char* format, ...) {
   114     va_list ap;
   115     va_start(ap, format);
   116     vappend(format, ap);
   117     va_end(ap);
   118   }
   120   void append_and_print_cr(const char* format, ...) {
   121     va_list ap;
   122     va_start(ap, format);
   123     vappend(format, ap);
   124     va_end(ap);
   125     gclog_or_tty->print_cr("%s", _buffer);
   126     _cur = _indent_level * INDENT_CHARS;
   127   }
   128 };
   130 G1CollectorPolicy::G1CollectorPolicy() :
   131   _parallel_gc_threads(G1CollectedHeap::use_parallel_gc_threads()
   132                         ? ParallelGCThreads : 1),
   134   _recent_gc_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
   135   _all_pause_times_ms(new NumberSeq()),
   136   _stop_world_start(0.0),
   137   _all_stop_world_times_ms(new NumberSeq()),
   138   _all_yield_times_ms(new NumberSeq()),
   139   _using_new_ratio_calculations(false),
   141   _summary(new Summary()),
   143   _cur_clear_ct_time_ms(0.0),
   144   _mark_closure_time_ms(0.0),
   146   _cur_ref_proc_time_ms(0.0),
   147   _cur_ref_enq_time_ms(0.0),
   149 #ifndef PRODUCT
   150   _min_clear_cc_time_ms(-1.0),
   151   _max_clear_cc_time_ms(-1.0),
   152   _cur_clear_cc_time_ms(0.0),
   153   _cum_clear_cc_time_ms(0.0),
   154   _num_cc_clears(0L),
   155 #endif
   157   _aux_num(10),
   158   _all_aux_times_ms(new NumberSeq[_aux_num]),
   159   _cur_aux_start_times_ms(new double[_aux_num]),
   160   _cur_aux_times_ms(new double[_aux_num]),
   161   _cur_aux_times_set(new bool[_aux_num]),
   163   _concurrent_mark_remark_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
   164   _concurrent_mark_cleanup_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
   166   _alloc_rate_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
   167   _prev_collection_pause_end_ms(0.0),
   168   _pending_card_diff_seq(new TruncatedSeq(TruncatedSeqLength)),
   169   _rs_length_diff_seq(new TruncatedSeq(TruncatedSeqLength)),
   170   _cost_per_card_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
   171   _fully_young_cards_per_entry_ratio_seq(new TruncatedSeq(TruncatedSeqLength)),
   172   _partially_young_cards_per_entry_ratio_seq(
   173                                          new TruncatedSeq(TruncatedSeqLength)),
   174   _cost_per_entry_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
   175   _partially_young_cost_per_entry_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
   176   _cost_per_byte_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
   177   _cost_per_byte_ms_during_cm_seq(new TruncatedSeq(TruncatedSeqLength)),
   178   _constant_other_time_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
   179   _young_other_cost_per_region_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
   180   _non_young_other_cost_per_region_ms_seq(
   181                                          new TruncatedSeq(TruncatedSeqLength)),
   183   _pending_cards_seq(new TruncatedSeq(TruncatedSeqLength)),
   184   _rs_lengths_seq(new TruncatedSeq(TruncatedSeqLength)),
   186   _pause_time_target_ms((double) MaxGCPauseMillis),
   188   _full_young_gcs(true),
   189   _full_young_pause_num(0),
   190   _partial_young_pause_num(0),
   192   _during_marking(false),
   193   _in_marking_window(false),
   194   _in_marking_window_im(false),
   196   _known_garbage_ratio(0.0),
   197   _known_garbage_bytes(0),
   199   _young_gc_eff_seq(new TruncatedSeq(TruncatedSeqLength)),
   201    _recent_prev_end_times_for_all_gcs_sec(new TruncatedSeq(NumPrevPausesForHeuristics)),
   203   _recent_avg_pause_time_ratio(0.0),
   205   _all_full_gc_times_ms(new NumberSeq()),
   207   _initiate_conc_mark_if_possible(false),
   208   _during_initial_mark_pause(false),
   209   _should_revert_to_full_young_gcs(false),
   210   _last_full_young_gc(false),
   212   _eden_bytes_before_gc(0),
   213   _survivor_bytes_before_gc(0),
   214   _capacity_before_gc(0),
   216   _prev_collection_pause_used_at_end_bytes(0),
   218   _eden_cset_region_length(0),
   219   _survivor_cset_region_length(0),
   220   _old_cset_region_length(0),
   222   _collection_set(NULL),
   223   _collection_set_bytes_used_before(0),
   225   // Incremental CSet attributes
   226   _inc_cset_build_state(Inactive),
   227   _inc_cset_head(NULL),
   228   _inc_cset_tail(NULL),
   229   _inc_cset_bytes_used_before(0),
   230   _inc_cset_max_finger(NULL),
   231   _inc_cset_recorded_rs_lengths(0),
   232   _inc_cset_predicted_elapsed_time_ms(0.0),
   234 #ifdef _MSC_VER // the use of 'this' below gets a warning, make it go away
   235 #pragma warning( disable:4355 ) // 'this' : used in base member initializer list
   236 #endif // _MSC_VER
   238   _short_lived_surv_rate_group(new SurvRateGroup(this, "Short Lived",
   239                                                  G1YoungSurvRateNumRegionsSummary)),
   240   _survivor_surv_rate_group(new SurvRateGroup(this, "Survivor",
   241                                               G1YoungSurvRateNumRegionsSummary)),
   242   // add here any more surv rate groups
   243   _recorded_survivor_regions(0),
   244   _recorded_survivor_head(NULL),
   245   _recorded_survivor_tail(NULL),
   246   _survivors_age_table(true),
   248   _gc_overhead_perc(0.0) {
   250   // Set up the region size and associated fields. Given that the
   251   // policy is created before the heap, we have to set this up here,
   252   // so it's done as soon as possible.
   253   HeapRegion::setup_heap_region_size(Arguments::min_heap_size());
   254   HeapRegionRemSet::setup_remset_size();
   256   G1ErgoVerbose::initialize();
   257   if (PrintAdaptiveSizePolicy) {
   258     // Currently, we only use a single switch for all the heuristics.
   259     G1ErgoVerbose::set_enabled(true);
   260     // Given that we don't currently have a verboseness level
   261     // parameter, we'll hardcode this to high. This can be easily
   262     // changed in the future.
   263     G1ErgoVerbose::set_level(ErgoHigh);
   264   } else {
   265     G1ErgoVerbose::set_enabled(false);
   266   }
   268   // Verify PLAB sizes
   269   const size_t region_size = HeapRegion::GrainWords;
   270   if (YoungPLABSize > region_size || OldPLABSize > region_size) {
   271     char buffer[128];
   272     jio_snprintf(buffer, sizeof(buffer), "%sPLABSize should be at most "SIZE_FORMAT,
   273                  OldPLABSize > region_size ? "Old" : "Young", region_size);
   274     vm_exit_during_initialization(buffer);
   275   }
   277   _recent_prev_end_times_for_all_gcs_sec->add(os::elapsedTime());
   278   _prev_collection_pause_end_ms = os::elapsedTime() * 1000.0;
   280   _par_last_gc_worker_start_times_ms = new double[_parallel_gc_threads];
   281   _par_last_ext_root_scan_times_ms = new double[_parallel_gc_threads];
   282   _par_last_mark_stack_scan_times_ms = new double[_parallel_gc_threads];
   284   _par_last_update_rs_times_ms = new double[_parallel_gc_threads];
   285   _par_last_update_rs_processed_buffers = new double[_parallel_gc_threads];
   287   _par_last_scan_rs_times_ms = new double[_parallel_gc_threads];
   289   _par_last_obj_copy_times_ms = new double[_parallel_gc_threads];
   291   _par_last_termination_times_ms = new double[_parallel_gc_threads];
   292   _par_last_termination_attempts = new double[_parallel_gc_threads];
   293   _par_last_gc_worker_end_times_ms = new double[_parallel_gc_threads];
   294   _par_last_gc_worker_times_ms = new double[_parallel_gc_threads];
   295   _par_last_gc_worker_other_times_ms = new double[_parallel_gc_threads];
   297   // start conservatively
   298   _expensive_region_limit_ms = 0.5 * (double) MaxGCPauseMillis;
   300   int index;
   301   if (ParallelGCThreads == 0)
   302     index = 0;
   303   else if (ParallelGCThreads > 8)
   304     index = 7;
   305   else
   306     index = ParallelGCThreads - 1;
   308   _pending_card_diff_seq->add(0.0);
   309   _rs_length_diff_seq->add(rs_length_diff_defaults[index]);
   310   _cost_per_card_ms_seq->add(cost_per_card_ms_defaults[index]);
   311   _fully_young_cards_per_entry_ratio_seq->add(
   312                             fully_young_cards_per_entry_ratio_defaults[index]);
   313   _cost_per_entry_ms_seq->add(cost_per_entry_ms_defaults[index]);
   314   _cost_per_byte_ms_seq->add(cost_per_byte_ms_defaults[index]);
   315   _constant_other_time_ms_seq->add(constant_other_time_ms_defaults[index]);
   316   _young_other_cost_per_region_ms_seq->add(
   317                                young_other_cost_per_region_ms_defaults[index]);
   318   _non_young_other_cost_per_region_ms_seq->add(
   319                            non_young_other_cost_per_region_ms_defaults[index]);
   321   // Below, we might need to calculate the pause time target based on
   322   // the pause interval. When we do so we are going to give G1 maximum
   323   // flexibility and allow it to do pauses when it needs to. So, we'll
   324   // arrange that the pause interval to be pause time target + 1 to
   325   // ensure that a) the pause time target is maximized with respect to
   326   // the pause interval and b) we maintain the invariant that pause
   327   // time target < pause interval. If the user does not want this
   328   // maximum flexibility, they will have to set the pause interval
   329   // explicitly.
   331   // First make sure that, if either parameter is set, its value is
   332   // reasonable.
   333   if (!FLAG_IS_DEFAULT(MaxGCPauseMillis)) {
   334     if (MaxGCPauseMillis < 1) {
   335       vm_exit_during_initialization("MaxGCPauseMillis should be "
   336                                     "greater than 0");
   337     }
   338   }
   339   if (!FLAG_IS_DEFAULT(GCPauseIntervalMillis)) {
   340     if (GCPauseIntervalMillis < 1) {
   341       vm_exit_during_initialization("GCPauseIntervalMillis should be "
   342                                     "greater than 0");
   343     }
   344   }
   346   // Then, if the pause time target parameter was not set, set it to
   347   // the default value.
   348   if (FLAG_IS_DEFAULT(MaxGCPauseMillis)) {
   349     if (FLAG_IS_DEFAULT(GCPauseIntervalMillis)) {
   350       // The default pause time target in G1 is 200ms
   351       FLAG_SET_DEFAULT(MaxGCPauseMillis, 200);
   352     } else {
   353       // We do not allow the pause interval to be set without the
   354       // pause time target
   355       vm_exit_during_initialization("GCPauseIntervalMillis cannot be set "
   356                                     "without setting MaxGCPauseMillis");
   357     }
   358   }
   360   // Then, if the interval parameter was not set, set it according to
   361   // the pause time target (this will also deal with the case when the
   362   // pause time target is the default value).
   363   if (FLAG_IS_DEFAULT(GCPauseIntervalMillis)) {
   364     FLAG_SET_DEFAULT(GCPauseIntervalMillis, MaxGCPauseMillis + 1);
   365   }
   367   // Finally, make sure that the two parameters are consistent.
   368   if (MaxGCPauseMillis >= GCPauseIntervalMillis) {
   369     char buffer[256];
   370     jio_snprintf(buffer, 256,
   371                  "MaxGCPauseMillis (%u) should be less than "
   372                  "GCPauseIntervalMillis (%u)",
   373                  MaxGCPauseMillis, GCPauseIntervalMillis);
   374     vm_exit_during_initialization(buffer);
   375   }
   377   double max_gc_time = (double) MaxGCPauseMillis / 1000.0;
   378   double time_slice  = (double) GCPauseIntervalMillis / 1000.0;
   379   _mmu_tracker = new G1MMUTrackerQueue(time_slice, max_gc_time);
   380   _sigma = (double) G1ConfidencePercent / 100.0;
   382   // start conservatively (around 50ms is about right)
   383   _concurrent_mark_remark_times_ms->add(0.05);
   384   _concurrent_mark_cleanup_times_ms->add(0.20);
   385   _tenuring_threshold = MaxTenuringThreshold;
   386   // _max_survivor_regions will be calculated by
   387   // update_young_list_target_length() during initialization.
   388   _max_survivor_regions = 0;
   390   assert(GCTimeRatio > 0,
   391          "we should have set it to a default value set_g1_gc_flags() "
   392          "if a user set it to 0");
   393   _gc_overhead_perc = 100.0 * (1.0 / (1.0 + GCTimeRatio));
   395   uintx reserve_perc = G1ReservePercent;
   396   // Put an artificial ceiling on this so that it's not set to a silly value.
   397   if (reserve_perc > 50) {
   398     reserve_perc = 50;
   399     warning("G1ReservePercent is set to a value that is too large, "
   400             "it's been updated to %u", reserve_perc);
   401   }
   402   _reserve_factor = (double) reserve_perc / 100.0;
   403   // This will be set when the heap is expanded
   404   // for the first time during initialization.
   405   _reserve_regions = 0;
   407   initialize_all();
   408   _collectionSetChooser = new CollectionSetChooser();
   409 }
   411 // Increment "i", mod "len"
   412 static void inc_mod(int& i, int len) {
   413   i++; if (i == len) i = 0;
   414 }
   416 void G1CollectorPolicy::initialize_flags() {
   417   set_min_alignment(HeapRegion::GrainBytes);
   418   set_max_alignment(GenRemSet::max_alignment_constraint(rem_set_name()));
   419   if (SurvivorRatio < 1) {
   420     vm_exit_during_initialization("Invalid survivor ratio specified");
   421   }
   422   CollectorPolicy::initialize_flags();
   423 }
   425 // The easiest way to deal with the parsing of the NewSize /
   426 // MaxNewSize / etc. parameteres is to re-use the code in the
   427 // TwoGenerationCollectorPolicy class. This is similar to what
   428 // ParallelScavenge does with its GenerationSizer class (see
   429 // ParallelScavengeHeap::initialize()). We might change this in the
   430 // future, but it's a good start.
   431 class G1YoungGenSizer : public TwoGenerationCollectorPolicy {
   432 private:
   433   size_t size_to_region_num(size_t byte_size) {
   434     return MAX2((size_t) 1, byte_size / HeapRegion::GrainBytes);
   435   }
   437 public:
   438   G1YoungGenSizer() {
   439     initialize_flags();
   440     initialize_size_info();
   441   }
   442   size_t min_young_region_num() {
   443     return size_to_region_num(_min_gen0_size);
   444   }
   445   size_t initial_young_region_num() {
   446     return size_to_region_num(_initial_gen0_size);
   447   }
   448   size_t max_young_region_num() {
   449     return size_to_region_num(_max_gen0_size);
   450   }
   451 };
   453 void G1CollectorPolicy::update_young_list_size_using_newratio(size_t number_of_heap_regions) {
   454   assert(number_of_heap_regions > 0, "Heap must be initialized");
   455   size_t young_size = number_of_heap_regions / (NewRatio + 1);
   456   _min_desired_young_length = young_size;
   457   _max_desired_young_length = young_size;
   458 }
   460 void G1CollectorPolicy::init() {
   461   // Set aside an initial future to_space.
   462   _g1 = G1CollectedHeap::heap();
   464   assert(Heap_lock->owned_by_self(), "Locking discipline.");
   466   initialize_gc_policy_counters();
   468   G1YoungGenSizer sizer;
   469   _min_desired_young_length = sizer.min_young_region_num();
   470   _max_desired_young_length = sizer.max_young_region_num();
   472   if (FLAG_IS_CMDLINE(NewRatio)) {
   473     if (FLAG_IS_CMDLINE(NewSize) || FLAG_IS_CMDLINE(MaxNewSize)) {
   474       warning("-XX:NewSize and -XX:MaxNewSize override -XX:NewRatio");
   475     } else {
   476       // Treat NewRatio as a fixed size that is only recalculated when the heap size changes
   477       update_young_list_size_using_newratio(_g1->n_regions());
   478       _using_new_ratio_calculations = true;
   479     }
   480   }
   482   assert(_min_desired_young_length <= _max_desired_young_length, "Invalid min/max young gen size values");
   484   set_adaptive_young_list_length(_min_desired_young_length < _max_desired_young_length);
   485   if (adaptive_young_list_length()) {
   486     _young_list_fixed_length = 0;
   487   } else {
   488     assert(_min_desired_young_length == _max_desired_young_length, "Min and max young size differ");
   489     _young_list_fixed_length = _min_desired_young_length;
   490   }
   491   _free_regions_at_end_of_collection = _g1->free_regions();
   492   update_young_list_target_length();
   493   _prev_eden_capacity = _young_list_target_length * HeapRegion::GrainBytes;
   495   // We may immediately start allocating regions and placing them on the
   496   // collection set list. Initialize the per-collection set info
   497   start_incremental_cset_building();
   498 }
   500 // Create the jstat counters for the policy.
   501 void G1CollectorPolicy::initialize_gc_policy_counters() {
   502   _gc_policy_counters = new GCPolicyCounters("GarbageFirst", 1, 3);
   503 }
   505 bool G1CollectorPolicy::predict_will_fit(size_t young_length,
   506                                          double base_time_ms,
   507                                          size_t base_free_regions,
   508                                          double target_pause_time_ms) {
   509   if (young_length >= base_free_regions) {
   510     // end condition 1: not enough space for the young regions
   511     return false;
   512   }
   514   double accum_surv_rate = accum_yg_surv_rate_pred((int)(young_length - 1));
   515   size_t bytes_to_copy =
   516                (size_t) (accum_surv_rate * (double) HeapRegion::GrainBytes);
   517   double copy_time_ms = predict_object_copy_time_ms(bytes_to_copy);
   518   double young_other_time_ms = predict_young_other_time_ms(young_length);
   519   double pause_time_ms = base_time_ms + copy_time_ms + young_other_time_ms;
   520   if (pause_time_ms > target_pause_time_ms) {
   521     // end condition 2: prediction is over the target pause time
   522     return false;
   523   }
   525   size_t free_bytes =
   526                   (base_free_regions - young_length) * HeapRegion::GrainBytes;
   527   if ((2.0 * sigma()) * (double) bytes_to_copy > (double) free_bytes) {
   528     // end condition 3: out-of-space (conservatively!)
   529     return false;
   530   }
   532   // success!
   533   return true;
   534 }
   536 void G1CollectorPolicy::record_new_heap_size(size_t new_number_of_regions) {
   537   // re-calculate the necessary reserve
   538   double reserve_regions_d = (double) new_number_of_regions * _reserve_factor;
   539   // We use ceiling so that if reserve_regions_d is > 0.0 (but
   540   // smaller than 1.0) we'll get 1.
   541   _reserve_regions = (size_t) ceil(reserve_regions_d);
   543   if (_using_new_ratio_calculations) {
   544     // -XX:NewRatio was specified so we need to update the
   545     // young gen length when the heap size has changed.
   546     update_young_list_size_using_newratio(new_number_of_regions);
   547   }
   548 }
   550 size_t G1CollectorPolicy::calculate_young_list_desired_min_length(
   551                                                      size_t base_min_length) {
   552   size_t desired_min_length = 0;
   553   if (adaptive_young_list_length()) {
   554     if (_alloc_rate_ms_seq->num() > 3) {
   555       double now_sec = os::elapsedTime();
   556       double when_ms = _mmu_tracker->when_max_gc_sec(now_sec) * 1000.0;
   557       double alloc_rate_ms = predict_alloc_rate_ms();
   558       desired_min_length = (size_t) ceil(alloc_rate_ms * when_ms);
   559     } else {
   560       // otherwise we don't have enough info to make the prediction
   561     }
   562   }
   563   desired_min_length += base_min_length;
   564   // make sure we don't go below any user-defined minimum bound
   565   return MAX2(_min_desired_young_length, desired_min_length);
   566 }
   568 size_t G1CollectorPolicy::calculate_young_list_desired_max_length() {
   569   // Here, we might want to also take into account any additional
   570   // constraints (i.e., user-defined minimum bound). Currently, we
   571   // effectively don't set this bound.
   572   return _max_desired_young_length;
   573 }
   575 void G1CollectorPolicy::update_young_list_target_length(size_t rs_lengths) {
   576   if (rs_lengths == (size_t) -1) {
   577     // if it's set to the default value (-1), we should predict it;
   578     // otherwise, use the given value.
   579     rs_lengths = (size_t) get_new_prediction(_rs_lengths_seq);
   580   }
   582   // Calculate the absolute and desired min bounds.
   584   // This is how many young regions we already have (currently: the survivors).
   585   size_t base_min_length = recorded_survivor_regions();
   586   // This is the absolute minimum young length, which ensures that we
   587   // can allocate one eden region in the worst-case.
   588   size_t absolute_min_length = base_min_length + 1;
   589   size_t desired_min_length =
   590                      calculate_young_list_desired_min_length(base_min_length);
   591   if (desired_min_length < absolute_min_length) {
   592     desired_min_length = absolute_min_length;
   593   }
   595   // Calculate the absolute and desired max bounds.
   597   // We will try our best not to "eat" into the reserve.
   598   size_t absolute_max_length = 0;
   599   if (_free_regions_at_end_of_collection > _reserve_regions) {
   600     absolute_max_length = _free_regions_at_end_of_collection - _reserve_regions;
   601   }
   602   size_t desired_max_length = calculate_young_list_desired_max_length();
   603   if (desired_max_length > absolute_max_length) {
   604     desired_max_length = absolute_max_length;
   605   }
   607   size_t young_list_target_length = 0;
   608   if (adaptive_young_list_length()) {
   609     if (full_young_gcs()) {
   610       young_list_target_length =
   611                         calculate_young_list_target_length(rs_lengths,
   612                                                            base_min_length,
   613                                                            desired_min_length,
   614                                                            desired_max_length);
   615       _rs_lengths_prediction = rs_lengths;
   616     } else {
   617       // Don't calculate anything and let the code below bound it to
   618       // the desired_min_length, i.e., do the next GC as soon as
   619       // possible to maximize how many old regions we can add to it.
   620     }
   621   } else {
   622     if (full_young_gcs()) {
   623       young_list_target_length = _young_list_fixed_length;
   624     } else {
   625       // A bit arbitrary: during partially-young GCs we allocate half
   626       // the young regions to try to add old regions to the CSet.
   627       young_list_target_length = _young_list_fixed_length / 2;
   628       // We choose to accept that we might go under the desired min
   629       // length given that we intentionally ask for a smaller young gen.
   630       desired_min_length = absolute_min_length;
   631     }
   632   }
   634   // Make sure we don't go over the desired max length, nor under the
   635   // desired min length. In case they clash, desired_min_length wins
   636   // which is why that test is second.
   637   if (young_list_target_length > desired_max_length) {
   638     young_list_target_length = desired_max_length;
   639   }
   640   if (young_list_target_length < desired_min_length) {
   641     young_list_target_length = desired_min_length;
   642   }
   644   assert(young_list_target_length > recorded_survivor_regions(),
   645          "we should be able to allocate at least one eden region");
   646   assert(young_list_target_length >= absolute_min_length, "post-condition");
   647   _young_list_target_length = young_list_target_length;
   649   update_max_gc_locker_expansion();
   650 }
   652 size_t
   653 G1CollectorPolicy::calculate_young_list_target_length(size_t rs_lengths,
   654                                                    size_t base_min_length,
   655                                                    size_t desired_min_length,
   656                                                    size_t desired_max_length) {
   657   assert(adaptive_young_list_length(), "pre-condition");
   658   assert(full_young_gcs(), "only call this for fully-young GCs");
   660   // In case some edge-condition makes the desired max length too small...
   661   if (desired_max_length <= desired_min_length) {
   662     return desired_min_length;
   663   }
   665   // We'll adjust min_young_length and max_young_length not to include
   666   // the already allocated young regions (i.e., so they reflect the
   667   // min and max eden regions we'll allocate). The base_min_length
   668   // will be reflected in the predictions by the
   669   // survivor_regions_evac_time prediction.
   670   assert(desired_min_length > base_min_length, "invariant");
   671   size_t min_young_length = desired_min_length - base_min_length;
   672   assert(desired_max_length > base_min_length, "invariant");
   673   size_t max_young_length = desired_max_length - base_min_length;
   675   double target_pause_time_ms = _mmu_tracker->max_gc_time() * 1000.0;
   676   double survivor_regions_evac_time = predict_survivor_regions_evac_time();
   677   size_t pending_cards = (size_t) get_new_prediction(_pending_cards_seq);
   678   size_t adj_rs_lengths = rs_lengths + predict_rs_length_diff();
   679   size_t scanned_cards = predict_young_card_num(adj_rs_lengths);
   680   double base_time_ms =
   681     predict_base_elapsed_time_ms(pending_cards, scanned_cards) +
   682     survivor_regions_evac_time;
   683   size_t available_free_regions = _free_regions_at_end_of_collection;
   684   size_t base_free_regions = 0;
   685   if (available_free_regions > _reserve_regions) {
   686     base_free_regions = available_free_regions - _reserve_regions;
   687   }
   689   // Here, we will make sure that the shortest young length that
   690   // makes sense fits within the target pause time.
   692   if (predict_will_fit(min_young_length, base_time_ms,
   693                        base_free_regions, target_pause_time_ms)) {
   694     // The shortest young length will fit into the target pause time;
   695     // we'll now check whether the absolute maximum number of young
   696     // regions will fit in the target pause time. If not, we'll do
   697     // a binary search between min_young_length and max_young_length.
   698     if (predict_will_fit(max_young_length, base_time_ms,
   699                          base_free_regions, target_pause_time_ms)) {
   700       // The maximum young length will fit into the target pause time.
   701       // We are done so set min young length to the maximum length (as
   702       // the result is assumed to be returned in min_young_length).
   703       min_young_length = max_young_length;
   704     } else {
   705       // The maximum possible number of young regions will not fit within
   706       // the target pause time so we'll search for the optimal
   707       // length. The loop invariants are:
   708       //
   709       // min_young_length < max_young_length
   710       // min_young_length is known to fit into the target pause time
   711       // max_young_length is known not to fit into the target pause time
   712       //
   713       // Going into the loop we know the above hold as we've just
   714       // checked them. Every time around the loop we check whether
   715       // the middle value between min_young_length and
   716       // max_young_length fits into the target pause time. If it
   717       // does, it becomes the new min. If it doesn't, it becomes
   718       // the new max. This way we maintain the loop invariants.
   720       assert(min_young_length < max_young_length, "invariant");
   721       size_t diff = (max_young_length - min_young_length) / 2;
   722       while (diff > 0) {
   723         size_t young_length = min_young_length + diff;
   724         if (predict_will_fit(young_length, base_time_ms,
   725                              base_free_regions, target_pause_time_ms)) {
   726           min_young_length = young_length;
   727         } else {
   728           max_young_length = young_length;
   729         }
   730         assert(min_young_length <  max_young_length, "invariant");
   731         diff = (max_young_length - min_young_length) / 2;
   732       }
   733       // The results is min_young_length which, according to the
   734       // loop invariants, should fit within the target pause time.
   736       // These are the post-conditions of the binary search above:
   737       assert(min_young_length < max_young_length,
   738              "otherwise we should have discovered that max_young_length "
   739              "fits into the pause target and not done the binary search");
   740       assert(predict_will_fit(min_young_length, base_time_ms,
   741                               base_free_regions, target_pause_time_ms),
   742              "min_young_length, the result of the binary search, should "
   743              "fit into the pause target");
   744       assert(!predict_will_fit(min_young_length + 1, base_time_ms,
   745                                base_free_regions, target_pause_time_ms),
   746              "min_young_length, the result of the binary search, should be "
   747              "optimal, so no larger length should fit into the pause target");
   748     }
   749   } else {
   750     // Even the minimum length doesn't fit into the pause time
   751     // target, return it as the result nevertheless.
   752   }
   753   return base_min_length + min_young_length;
   754 }
   756 double G1CollectorPolicy::predict_survivor_regions_evac_time() {
   757   double survivor_regions_evac_time = 0.0;
   758   for (HeapRegion * r = _recorded_survivor_head;
   759        r != NULL && r != _recorded_survivor_tail->get_next_young_region();
   760        r = r->get_next_young_region()) {
   761     survivor_regions_evac_time += predict_region_elapsed_time_ms(r, true);
   762   }
   763   return survivor_regions_evac_time;
   764 }
   766 void G1CollectorPolicy::revise_young_list_target_length_if_necessary() {
   767   guarantee( adaptive_young_list_length(), "should not call this otherwise" );
   769   size_t rs_lengths = _g1->young_list()->sampled_rs_lengths();
   770   if (rs_lengths > _rs_lengths_prediction) {
   771     // add 10% to avoid having to recalculate often
   772     size_t rs_lengths_prediction = rs_lengths * 1100 / 1000;
   773     update_young_list_target_length(rs_lengths_prediction);
   774   }
   775 }
   779 HeapWord* G1CollectorPolicy::mem_allocate_work(size_t size,
   780                                                bool is_tlab,
   781                                                bool* gc_overhead_limit_was_exceeded) {
   782   guarantee(false, "Not using this policy feature yet.");
   783   return NULL;
   784 }
   786 // This method controls how a collector handles one or more
   787 // of its generations being fully allocated.
   788 HeapWord* G1CollectorPolicy::satisfy_failed_allocation(size_t size,
   789                                                        bool is_tlab) {
   790   guarantee(false, "Not using this policy feature yet.");
   791   return NULL;
   792 }
   795 #ifndef PRODUCT
   796 bool G1CollectorPolicy::verify_young_ages() {
   797   HeapRegion* head = _g1->young_list()->first_region();
   798   return
   799     verify_young_ages(head, _short_lived_surv_rate_group);
   800   // also call verify_young_ages on any additional surv rate groups
   801 }
   803 bool
   804 G1CollectorPolicy::verify_young_ages(HeapRegion* head,
   805                                      SurvRateGroup *surv_rate_group) {
   806   guarantee( surv_rate_group != NULL, "pre-condition" );
   808   const char* name = surv_rate_group->name();
   809   bool ret = true;
   810   int prev_age = -1;
   812   for (HeapRegion* curr = head;
   813        curr != NULL;
   814        curr = curr->get_next_young_region()) {
   815     SurvRateGroup* group = curr->surv_rate_group();
   816     if (group == NULL && !curr->is_survivor()) {
   817       gclog_or_tty->print_cr("## %s: encountered NULL surv_rate_group", name);
   818       ret = false;
   819     }
   821     if (surv_rate_group == group) {
   822       int age = curr->age_in_surv_rate_group();
   824       if (age < 0) {
   825         gclog_or_tty->print_cr("## %s: encountered negative age", name);
   826         ret = false;
   827       }
   829       if (age <= prev_age) {
   830         gclog_or_tty->print_cr("## %s: region ages are not strictly increasing "
   831                                "(%d, %d)", name, age, prev_age);
   832         ret = false;
   833       }
   834       prev_age = age;
   835     }
   836   }
   838   return ret;
   839 }
   840 #endif // PRODUCT
   842 void G1CollectorPolicy::record_full_collection_start() {
   843   _cur_collection_start_sec = os::elapsedTime();
   844   // Release the future to-space so that it is available for compaction into.
   845   _g1->set_full_collection();
   846 }
   848 void G1CollectorPolicy::record_full_collection_end() {
   849   // Consider this like a collection pause for the purposes of allocation
   850   // since last pause.
   851   double end_sec = os::elapsedTime();
   852   double full_gc_time_sec = end_sec - _cur_collection_start_sec;
   853   double full_gc_time_ms = full_gc_time_sec * 1000.0;
   855   _all_full_gc_times_ms->add(full_gc_time_ms);
   857   update_recent_gc_times(end_sec, full_gc_time_ms);
   859   _g1->clear_full_collection();
   861   // "Nuke" the heuristics that control the fully/partially young GC
   862   // transitions and make sure we start with fully young GCs after the
   863   // Full GC.
   864   set_full_young_gcs(true);
   865   _last_full_young_gc = false;
   866   _should_revert_to_full_young_gcs = false;
   867   clear_initiate_conc_mark_if_possible();
   868   clear_during_initial_mark_pause();
   869   _known_garbage_bytes = 0;
   870   _known_garbage_ratio = 0.0;
   871   _in_marking_window = false;
   872   _in_marking_window_im = false;
   874   _short_lived_surv_rate_group->start_adding_regions();
   875   // also call this on any additional surv rate groups
   877   record_survivor_regions(0, NULL, NULL);
   879   _free_regions_at_end_of_collection = _g1->free_regions();
   880   // Reset survivors SurvRateGroup.
   881   _survivor_surv_rate_group->reset();
   882   update_young_list_target_length();
   883   _collectionSetChooser->updateAfterFullCollection();
   884 }
   886 void G1CollectorPolicy::record_stop_world_start() {
   887   _stop_world_start = os::elapsedTime();
   888 }
   890 void G1CollectorPolicy::record_collection_pause_start(double start_time_sec,
   891                                                       size_t start_used) {
   892   if (PrintGCDetails) {
   893     gclog_or_tty->stamp(PrintGCTimeStamps);
   894     gclog_or_tty->print("[GC pause");
   895     gclog_or_tty->print(" (%s)", full_young_gcs() ? "young" : "partial");
   896   }
   898   // We only need to do this here as the policy will only be applied
   899   // to the GC we're about to start. so, no point is calculating this
   900   // every time we calculate / recalculate the target young length.
   901   update_survivors_policy();
   903   assert(_g1->used() == _g1->recalculate_used(),
   904          err_msg("sanity, used: "SIZE_FORMAT" recalculate_used: "SIZE_FORMAT,
   905                  _g1->used(), _g1->recalculate_used()));
   907   double s_w_t_ms = (start_time_sec - _stop_world_start) * 1000.0;
   908   _all_stop_world_times_ms->add(s_w_t_ms);
   909   _stop_world_start = 0.0;
   911   _cur_collection_start_sec = start_time_sec;
   912   _cur_collection_pause_used_at_start_bytes = start_used;
   913   _cur_collection_pause_used_regions_at_start = _g1->used_regions();
   914   _pending_cards = _g1->pending_card_num();
   915   _max_pending_cards = _g1->max_pending_card_num();
   917   _bytes_in_collection_set_before_gc = 0;
   918   _bytes_copied_during_gc = 0;
   920   YoungList* young_list = _g1->young_list();
   921   _eden_bytes_before_gc = young_list->eden_used_bytes();
   922   _survivor_bytes_before_gc = young_list->survivor_used_bytes();
   923   _capacity_before_gc = _g1->capacity();
   925 #ifdef DEBUG
   926   // initialise these to something well known so that we can spot
   927   // if they are not set properly
   929   for (int i = 0; i < _parallel_gc_threads; ++i) {
   930     _par_last_gc_worker_start_times_ms[i] = -1234.0;
   931     _par_last_ext_root_scan_times_ms[i] = -1234.0;
   932     _par_last_mark_stack_scan_times_ms[i] = -1234.0;
   933     _par_last_update_rs_times_ms[i] = -1234.0;
   934     _par_last_update_rs_processed_buffers[i] = -1234.0;
   935     _par_last_scan_rs_times_ms[i] = -1234.0;
   936     _par_last_obj_copy_times_ms[i] = -1234.0;
   937     _par_last_termination_times_ms[i] = -1234.0;
   938     _par_last_termination_attempts[i] = -1234.0;
   939     _par_last_gc_worker_end_times_ms[i] = -1234.0;
   940     _par_last_gc_worker_times_ms[i] = -1234.0;
   941     _par_last_gc_worker_other_times_ms[i] = -1234.0;
   942   }
   943 #endif
   945   for (int i = 0; i < _aux_num; ++i) {
   946     _cur_aux_times_ms[i] = 0.0;
   947     _cur_aux_times_set[i] = false;
   948   }
   950   // This is initialized to zero here and is set during
   951   // the evacuation pause if marking is in progress.
   952   _cur_satb_drain_time_ms = 0.0;
   954   _last_young_gc_full = false;
   956   // do that for any other surv rate groups
   957   _short_lived_surv_rate_group->stop_adding_regions();
   958   _survivors_age_table.clear();
   960   assert( verify_young_ages(), "region age verification" );
   961 }
   963 void G1CollectorPolicy::record_concurrent_mark_init_end(double
   964                                                    mark_init_elapsed_time_ms) {
   965   _during_marking = true;
   966   assert(!initiate_conc_mark_if_possible(), "we should have cleared it by now");
   967   clear_during_initial_mark_pause();
   968   _cur_mark_stop_world_time_ms = mark_init_elapsed_time_ms;
   969 }
   971 void G1CollectorPolicy::record_concurrent_mark_remark_start() {
   972   _mark_remark_start_sec = os::elapsedTime();
   973   _during_marking = false;
   974 }
   976 void G1CollectorPolicy::record_concurrent_mark_remark_end() {
   977   double end_time_sec = os::elapsedTime();
   978   double elapsed_time_ms = (end_time_sec - _mark_remark_start_sec)*1000.0;
   979   _concurrent_mark_remark_times_ms->add(elapsed_time_ms);
   980   _cur_mark_stop_world_time_ms += elapsed_time_ms;
   981   _prev_collection_pause_end_ms += elapsed_time_ms;
   983   _mmu_tracker->add_pause(_mark_remark_start_sec, end_time_sec, true);
   984 }
   986 void G1CollectorPolicy::record_concurrent_mark_cleanup_start() {
   987   _mark_cleanup_start_sec = os::elapsedTime();
   988 }
   990 void G1CollectorPolicy::record_concurrent_mark_cleanup_completed() {
   991   _should_revert_to_full_young_gcs = false;
   992   _last_full_young_gc = true;
   993   _in_marking_window = false;
   994 }
   996 void G1CollectorPolicy::record_concurrent_pause() {
   997   if (_stop_world_start > 0.0) {
   998     double yield_ms = (os::elapsedTime() - _stop_world_start) * 1000.0;
   999     _all_yield_times_ms->add(yield_ms);
  1003 void G1CollectorPolicy::record_concurrent_pause_end() {
  1006 template<class T>
  1007 T sum_of(T* sum_arr, int start, int n, int N) {
  1008   T sum = (T)0;
  1009   for (int i = 0; i < n; i++) {
  1010     int j = (start + i) % N;
  1011     sum += sum_arr[j];
  1013   return sum;
  1016 void G1CollectorPolicy::print_par_stats(int level,
  1017                                         const char* str,
  1018                                         double* data) {
  1019   double min = data[0], max = data[0];
  1020   double total = 0.0;
  1021   LineBuffer buf(level);
  1022   buf.append("[%s (ms):", str);
  1023   for (uint i = 0; i < no_of_gc_threads(); ++i) {
  1024     double val = data[i];
  1025     if (val < min)
  1026       min = val;
  1027     if (val > max)
  1028       max = val;
  1029     total += val;
  1030     buf.append("  %3.1lf", val);
  1032   buf.append_and_print_cr("");
  1033   double avg = total / (double) no_of_gc_threads();
  1034   buf.append_and_print_cr(" Avg: %5.1lf, Min: %5.1lf, Max: %5.1lf, Diff: %5.1lf]",
  1035     avg, min, max, max - min);
  1038 void G1CollectorPolicy::print_par_sizes(int level,
  1039                                         const char* str,
  1040                                         double* data) {
  1041   double min = data[0], max = data[0];
  1042   double total = 0.0;
  1043   LineBuffer buf(level);
  1044   buf.append("[%s :", str);
  1045   for (uint i = 0; i < no_of_gc_threads(); ++i) {
  1046     double val = data[i];
  1047     if (val < min)
  1048       min = val;
  1049     if (val > max)
  1050       max = val;
  1051     total += val;
  1052     buf.append(" %d", (int) val);
  1054   buf.append_and_print_cr("");
  1055   double avg = total / (double) no_of_gc_threads();
  1056   buf.append_and_print_cr(" Sum: %d, Avg: %d, Min: %d, Max: %d, Diff: %d]",
  1057     (int)total, (int)avg, (int)min, (int)max, (int)max - (int)min);
  1060 void G1CollectorPolicy::print_stats(int level,
  1061                                     const char* str,
  1062                                     double value) {
  1063   LineBuffer(level).append_and_print_cr("[%s: %5.1lf ms]", str, value);
  1066 void G1CollectorPolicy::print_stats(int level,
  1067                                     const char* str,
  1068                                     int value) {
  1069   LineBuffer(level).append_and_print_cr("[%s: %d]", str, value);
  1072 double G1CollectorPolicy::avg_value(double* data) {
  1073   if (G1CollectedHeap::use_parallel_gc_threads()) {
  1074     double ret = 0.0;
  1075     for (uint i = 0; i < no_of_gc_threads(); ++i) {
  1076       ret += data[i];
  1078     return ret / (double) no_of_gc_threads();
  1079   } else {
  1080     return data[0];
  1084 double G1CollectorPolicy::max_value(double* data) {
  1085   if (G1CollectedHeap::use_parallel_gc_threads()) {
  1086     double ret = data[0];
  1087     for (uint i = 1; i < no_of_gc_threads(); ++i) {
  1088       if (data[i] > ret) {
  1089         ret = data[i];
  1092     return ret;
  1093   } else {
  1094     return data[0];
  1098 double G1CollectorPolicy::sum_of_values(double* data) {
  1099   if (G1CollectedHeap::use_parallel_gc_threads()) {
  1100     double sum = 0.0;
  1101     for (uint i = 0; i < no_of_gc_threads(); i++) {
  1102       sum += data[i];
  1104     return sum;
  1105   } else {
  1106     return data[0];
  1110 double G1CollectorPolicy::max_sum(double* data1, double* data2) {
  1111   double ret = data1[0] + data2[0];
  1113   if (G1CollectedHeap::use_parallel_gc_threads()) {
  1114     for (uint i = 1; i < no_of_gc_threads(); ++i) {
  1115       double data = data1[i] + data2[i];
  1116       if (data > ret) {
  1117         ret = data;
  1121   return ret;
  1124 // Anything below that is considered to be zero
  1125 #define MIN_TIMER_GRANULARITY 0.0000001
  1127 void G1CollectorPolicy::record_collection_pause_end(int no_of_gc_threads) {
  1128   double end_time_sec = os::elapsedTime();
  1129   double elapsed_ms = _last_pause_time_ms;
  1130   bool parallel = G1CollectedHeap::use_parallel_gc_threads();
  1131   assert(_cur_collection_pause_used_regions_at_start >= cset_region_length(),
  1132          "otherwise, the subtraction below does not make sense");
  1133   size_t rs_size =
  1134             _cur_collection_pause_used_regions_at_start - cset_region_length();
  1135   size_t cur_used_bytes = _g1->used();
  1136   assert(cur_used_bytes == _g1->recalculate_used(), "It should!");
  1137   bool last_pause_included_initial_mark = false;
  1138   bool update_stats = !_g1->evacuation_failed();
  1139   set_no_of_gc_threads(no_of_gc_threads);
  1141 #ifndef PRODUCT
  1142   if (G1YoungSurvRateVerbose) {
  1143     gclog_or_tty->print_cr("");
  1144     _short_lived_surv_rate_group->print();
  1145     // do that for any other surv rate groups too
  1147 #endif // PRODUCT
  1149   last_pause_included_initial_mark = during_initial_mark_pause();
  1150   if (last_pause_included_initial_mark)
  1151     record_concurrent_mark_init_end(0.0);
  1153   size_t marking_initiating_used_threshold =
  1154     (_g1->capacity() / 100) * InitiatingHeapOccupancyPercent;
  1156   if (!_g1->mark_in_progress() && !_last_full_young_gc) {
  1157     assert(!last_pause_included_initial_mark, "invariant");
  1158     if (cur_used_bytes > marking_initiating_used_threshold) {
  1159       if (cur_used_bytes > _prev_collection_pause_used_at_end_bytes) {
  1160         assert(!during_initial_mark_pause(), "we should not see this here");
  1162         ergo_verbose3(ErgoConcCycles,
  1163                       "request concurrent cycle initiation",
  1164                       ergo_format_reason("occupancy higher than threshold")
  1165                       ergo_format_byte("occupancy")
  1166                       ergo_format_byte_perc("threshold"),
  1167                       cur_used_bytes,
  1168                       marking_initiating_used_threshold,
  1169                       (double) InitiatingHeapOccupancyPercent);
  1171         // Note: this might have already been set, if during the last
  1172         // pause we decided to start a cycle but at the beginning of
  1173         // this pause we decided to postpone it. That's OK.
  1174         set_initiate_conc_mark_if_possible();
  1175       } else {
  1176         ergo_verbose2(ErgoConcCycles,
  1177                   "do not request concurrent cycle initiation",
  1178                   ergo_format_reason("occupancy lower than previous occupancy")
  1179                   ergo_format_byte("occupancy")
  1180                   ergo_format_byte("previous occupancy"),
  1181                   cur_used_bytes,
  1182                   _prev_collection_pause_used_at_end_bytes);
  1187   _prev_collection_pause_used_at_end_bytes = cur_used_bytes;
  1189   _mmu_tracker->add_pause(end_time_sec - elapsed_ms/1000.0,
  1190                           end_time_sec, false);
  1192   // This assert is exempted when we're doing parallel collection pauses,
  1193   // because the fragmentation caused by the parallel GC allocation buffers
  1194   // can lead to more memory being used during collection than was used
  1195   // before. Best leave this out until the fragmentation problem is fixed.
  1196   // Pauses in which evacuation failed can also lead to negative
  1197   // collections, since no space is reclaimed from a region containing an
  1198   // object whose evacuation failed.
  1199   // Further, we're now always doing parallel collection.  But I'm still
  1200   // leaving this here as a placeholder for a more precise assertion later.
  1201   // (DLD, 10/05.)
  1202   assert((true || parallel) // Always using GC LABs now.
  1203          || _g1->evacuation_failed()
  1204          || _cur_collection_pause_used_at_start_bytes >= cur_used_bytes,
  1205          "Negative collection");
  1207   size_t freed_bytes =
  1208     _cur_collection_pause_used_at_start_bytes - cur_used_bytes;
  1209   size_t surviving_bytes = _collection_set_bytes_used_before - freed_bytes;
  1211   double survival_fraction =
  1212     (double)surviving_bytes/
  1213     (double)_collection_set_bytes_used_before;
  1215   // These values are used to update the summary information that is
  1216   // displayed when TraceGen0Time is enabled, and are output as part
  1217   // of the PrintGCDetails output, in the non-parallel case.
  1219   double ext_root_scan_time = avg_value(_par_last_ext_root_scan_times_ms);
  1220   double mark_stack_scan_time = avg_value(_par_last_mark_stack_scan_times_ms);
  1221   double update_rs_time = avg_value(_par_last_update_rs_times_ms);
  1222   double update_rs_processed_buffers =
  1223     sum_of_values(_par_last_update_rs_processed_buffers);
  1224   double scan_rs_time = avg_value(_par_last_scan_rs_times_ms);
  1225   double obj_copy_time = avg_value(_par_last_obj_copy_times_ms);
  1226   double termination_time = avg_value(_par_last_termination_times_ms);
  1228   double known_time = ext_root_scan_time +
  1229                       mark_stack_scan_time +
  1230                       update_rs_time +
  1231                       scan_rs_time +
  1232                       obj_copy_time;
  1234   double other_time_ms = elapsed_ms;
  1236   // Subtract the SATB drain time. It's initialized to zero at the
  1237   // start of the pause and is updated during the pause if marking
  1238   // is in progress.
  1239   other_time_ms -= _cur_satb_drain_time_ms;
  1241   if (parallel) {
  1242     other_time_ms -= _cur_collection_par_time_ms;
  1243   } else {
  1244     other_time_ms -= known_time;
  1247   // Subtract the time taken to clean the card table from the
  1248   // current value of "other time"
  1249   other_time_ms -= _cur_clear_ct_time_ms;
  1251   // Subtract the time spent completing marking in the collection
  1252   // set. Note if marking is not in progress during the pause
  1253   // the value of _mark_closure_time_ms will be zero.
  1254   other_time_ms -= _mark_closure_time_ms;
  1256   // TraceGen0Time and TraceGen1Time summary info updating.
  1257   _all_pause_times_ms->add(elapsed_ms);
  1259   if (update_stats) {
  1260     _summary->record_total_time_ms(elapsed_ms);
  1261     _summary->record_other_time_ms(other_time_ms);
  1263     MainBodySummary* body_summary = _summary->main_body_summary();
  1264     assert(body_summary != NULL, "should not be null!");
  1266     // This will be non-zero iff marking is currently in progress (i.e.
  1267     // _g1->mark_in_progress() == true) and the currrent pause was not
  1268     // an initial mark pause. Since the body_summary items are NumberSeqs,
  1269     // however, they have to be consistent and updated in lock-step with
  1270     // each other. Therefore we unconditionally record the SATB drain
  1271     // time - even if it's zero.
  1272     body_summary->record_satb_drain_time_ms(_cur_satb_drain_time_ms);
  1274     body_summary->record_ext_root_scan_time_ms(ext_root_scan_time);
  1275     body_summary->record_mark_stack_scan_time_ms(mark_stack_scan_time);
  1276     body_summary->record_update_rs_time_ms(update_rs_time);
  1277     body_summary->record_scan_rs_time_ms(scan_rs_time);
  1278     body_summary->record_obj_copy_time_ms(obj_copy_time);
  1280     if (parallel) {
  1281       body_summary->record_parallel_time_ms(_cur_collection_par_time_ms);
  1282       body_summary->record_termination_time_ms(termination_time);
  1284       double parallel_known_time = known_time + termination_time;
  1285       double parallel_other_time = _cur_collection_par_time_ms - parallel_known_time;
  1286       body_summary->record_parallel_other_time_ms(parallel_other_time);
  1289     body_summary->record_mark_closure_time_ms(_mark_closure_time_ms);
  1290     body_summary->record_clear_ct_time_ms(_cur_clear_ct_time_ms);
  1292     // We exempt parallel collection from this check because Alloc Buffer
  1293     // fragmentation can produce negative collections.  Same with evac
  1294     // failure.
  1295     // Further, we're now always doing parallel collection.  But I'm still
  1296     // leaving this here as a placeholder for a more precise assertion later.
  1297     // (DLD, 10/05.
  1298     assert((true || parallel)
  1299            || _g1->evacuation_failed()
  1300            || surviving_bytes <= _collection_set_bytes_used_before,
  1301            "Or else negative collection!");
  1303     // this is where we update the allocation rate of the application
  1304     double app_time_ms =
  1305       (_cur_collection_start_sec * 1000.0 - _prev_collection_pause_end_ms);
  1306     if (app_time_ms < MIN_TIMER_GRANULARITY) {
  1307       // This usually happens due to the timer not having the required
  1308       // granularity. Some Linuxes are the usual culprits.
  1309       // We'll just set it to something (arbitrarily) small.
  1310       app_time_ms = 1.0;
  1312     // We maintain the invariant that all objects allocated by mutator
  1313     // threads will be allocated out of eden regions. So, we can use
  1314     // the eden region number allocated since the previous GC to
  1315     // calculate the application's allocate rate. The only exception
  1316     // to that is humongous objects that are allocated separately. But
  1317     // given that humongous object allocations do not really affect
  1318     // either the pause's duration nor when the next pause will take
  1319     // place we can safely ignore them here.
  1320     size_t regions_allocated = eden_cset_region_length();
  1321     double alloc_rate_ms = (double) regions_allocated / app_time_ms;
  1322     _alloc_rate_ms_seq->add(alloc_rate_ms);
  1324     double interval_ms =
  1325       (end_time_sec - _recent_prev_end_times_for_all_gcs_sec->oldest()) * 1000.0;
  1326     update_recent_gc_times(end_time_sec, elapsed_ms);
  1327     _recent_avg_pause_time_ratio = _recent_gc_times_ms->sum()/interval_ms;
  1328     if (recent_avg_pause_time_ratio() < 0.0 ||
  1329         (recent_avg_pause_time_ratio() - 1.0 > 0.0)) {
  1330 #ifndef PRODUCT
  1331       // Dump info to allow post-facto debugging
  1332       gclog_or_tty->print_cr("recent_avg_pause_time_ratio() out of bounds");
  1333       gclog_or_tty->print_cr("-------------------------------------------");
  1334       gclog_or_tty->print_cr("Recent GC Times (ms):");
  1335       _recent_gc_times_ms->dump();
  1336       gclog_or_tty->print_cr("(End Time=%3.3f) Recent GC End Times (s):", end_time_sec);
  1337       _recent_prev_end_times_for_all_gcs_sec->dump();
  1338       gclog_or_tty->print_cr("GC = %3.3f, Interval = %3.3f, Ratio = %3.3f",
  1339                              _recent_gc_times_ms->sum(), interval_ms, recent_avg_pause_time_ratio());
  1340       // In debug mode, terminate the JVM if the user wants to debug at this point.
  1341       assert(!G1FailOnFPError, "Debugging data for CR 6898948 has been dumped above");
  1342 #endif  // !PRODUCT
  1343       // Clip ratio between 0.0 and 1.0, and continue. This will be fixed in
  1344       // CR 6902692 by redoing the manner in which the ratio is incrementally computed.
  1345       if (_recent_avg_pause_time_ratio < 0.0) {
  1346         _recent_avg_pause_time_ratio = 0.0;
  1347       } else {
  1348         assert(_recent_avg_pause_time_ratio - 1.0 > 0.0, "Ctl-point invariant");
  1349         _recent_avg_pause_time_ratio = 1.0;
  1354   for (int i = 0; i < _aux_num; ++i) {
  1355     if (_cur_aux_times_set[i]) {
  1356       _all_aux_times_ms[i].add(_cur_aux_times_ms[i]);
  1360   // PrintGCDetails output
  1361   if (PrintGCDetails) {
  1362     bool print_marking_info =
  1363       _g1->mark_in_progress() && !last_pause_included_initial_mark;
  1365     gclog_or_tty->print_cr("%s, %1.8lf secs]",
  1366                            (last_pause_included_initial_mark) ? " (initial-mark)" : "",
  1367                            elapsed_ms / 1000.0);
  1369     if (print_marking_info) {
  1370       print_stats(1, "SATB Drain Time", _cur_satb_drain_time_ms);
  1373     if (parallel) {
  1374       print_stats(1, "Parallel Time", _cur_collection_par_time_ms);
  1375       print_par_stats(2, "GC Worker Start", _par_last_gc_worker_start_times_ms);
  1376       print_par_stats(2, "Ext Root Scanning", _par_last_ext_root_scan_times_ms);
  1377       if (print_marking_info) {
  1378         print_par_stats(2, "Mark Stack Scanning", _par_last_mark_stack_scan_times_ms);
  1380       print_par_stats(2, "Update RS", _par_last_update_rs_times_ms);
  1381       print_par_sizes(3, "Processed Buffers", _par_last_update_rs_processed_buffers);
  1382       print_par_stats(2, "Scan RS", _par_last_scan_rs_times_ms);
  1383       print_par_stats(2, "Object Copy", _par_last_obj_copy_times_ms);
  1384       print_par_stats(2, "Termination", _par_last_termination_times_ms);
  1385       print_par_sizes(3, "Termination Attempts", _par_last_termination_attempts);
  1386       print_par_stats(2, "GC Worker End", _par_last_gc_worker_end_times_ms);
  1388       for (int i = 0; i < _parallel_gc_threads; i++) {
  1389         _par_last_gc_worker_times_ms[i] = _par_last_gc_worker_end_times_ms[i] - _par_last_gc_worker_start_times_ms[i];
  1391         double worker_known_time = _par_last_ext_root_scan_times_ms[i] +
  1392                                    _par_last_mark_stack_scan_times_ms[i] +
  1393                                    _par_last_update_rs_times_ms[i] +
  1394                                    _par_last_scan_rs_times_ms[i] +
  1395                                    _par_last_obj_copy_times_ms[i] +
  1396                                    _par_last_termination_times_ms[i];
  1398         _par_last_gc_worker_other_times_ms[i] = _cur_collection_par_time_ms - worker_known_time;
  1400       print_par_stats(2, "GC Worker", _par_last_gc_worker_times_ms);
  1401       print_par_stats(2, "GC Worker Other", _par_last_gc_worker_other_times_ms);
  1402     } else {
  1403       print_stats(1, "Ext Root Scanning", ext_root_scan_time);
  1404       if (print_marking_info) {
  1405         print_stats(1, "Mark Stack Scanning", mark_stack_scan_time);
  1407       print_stats(1, "Update RS", update_rs_time);
  1408       print_stats(2, "Processed Buffers", (int)update_rs_processed_buffers);
  1409       print_stats(1, "Scan RS", scan_rs_time);
  1410       print_stats(1, "Object Copying", obj_copy_time);
  1412     if (print_marking_info) {
  1413       print_stats(1, "Complete CSet Marking", _mark_closure_time_ms);
  1415     print_stats(1, "Clear CT", _cur_clear_ct_time_ms);
  1416 #ifndef PRODUCT
  1417     print_stats(1, "Cur Clear CC", _cur_clear_cc_time_ms);
  1418     print_stats(1, "Cum Clear CC", _cum_clear_cc_time_ms);
  1419     print_stats(1, "Min Clear CC", _min_clear_cc_time_ms);
  1420     print_stats(1, "Max Clear CC", _max_clear_cc_time_ms);
  1421     if (_num_cc_clears > 0) {
  1422       print_stats(1, "Avg Clear CC", _cum_clear_cc_time_ms / ((double)_num_cc_clears));
  1424 #endif
  1425     print_stats(1, "Other", other_time_ms);
  1426     print_stats(2, "Choose CSet",
  1427                    (_recorded_young_cset_choice_time_ms +
  1428                     _recorded_non_young_cset_choice_time_ms));
  1429     print_stats(2, "Ref Proc", _cur_ref_proc_time_ms);
  1430     print_stats(2, "Ref Enq", _cur_ref_enq_time_ms);
  1431     print_stats(2, "Free CSet",
  1432                    (_recorded_young_free_cset_time_ms +
  1433                     _recorded_non_young_free_cset_time_ms));
  1435     for (int i = 0; i < _aux_num; ++i) {
  1436       if (_cur_aux_times_set[i]) {
  1437         char buffer[96];
  1438         sprintf(buffer, "Aux%d", i);
  1439         print_stats(1, buffer, _cur_aux_times_ms[i]);
  1444   // Update the efficiency-since-mark vars.
  1445   double proc_ms = elapsed_ms * (double) _parallel_gc_threads;
  1446   if (elapsed_ms < MIN_TIMER_GRANULARITY) {
  1447     // This usually happens due to the timer not having the required
  1448     // granularity. Some Linuxes are the usual culprits.
  1449     // We'll just set it to something (arbitrarily) small.
  1450     proc_ms = 1.0;
  1452   double cur_efficiency = (double) freed_bytes / proc_ms;
  1454   bool new_in_marking_window = _in_marking_window;
  1455   bool new_in_marking_window_im = false;
  1456   if (during_initial_mark_pause()) {
  1457     new_in_marking_window = true;
  1458     new_in_marking_window_im = true;
  1461   if (_last_full_young_gc) {
  1462     if (!last_pause_included_initial_mark) {
  1463       ergo_verbose2(ErgoPartiallyYoungGCs,
  1464                     "start partially-young GCs",
  1465                     ergo_format_byte_perc("known garbage"),
  1466                     _known_garbage_bytes, _known_garbage_ratio * 100.0);
  1467       set_full_young_gcs(false);
  1468     } else {
  1469       ergo_verbose0(ErgoPartiallyYoungGCs,
  1470                     "do not start partially-young GCs",
  1471                     ergo_format_reason("concurrent cycle is about to start"));
  1473     _last_full_young_gc = false;
  1476   if ( !_last_young_gc_full ) {
  1477     if (_should_revert_to_full_young_gcs) {
  1478       ergo_verbose2(ErgoPartiallyYoungGCs,
  1479                     "end partially-young GCs",
  1480                     ergo_format_reason("partially-young GCs end requested")
  1481                     ergo_format_byte_perc("known garbage"),
  1482                     _known_garbage_bytes, _known_garbage_ratio * 100.0);
  1483       set_full_young_gcs(true);
  1484     } else if (_known_garbage_ratio < 0.05) {
  1485       ergo_verbose3(ErgoPartiallyYoungGCs,
  1486                "end partially-young GCs",
  1487                ergo_format_reason("known garbage percent lower than threshold")
  1488                ergo_format_byte_perc("known garbage")
  1489                ergo_format_perc("threshold"),
  1490                _known_garbage_bytes, _known_garbage_ratio * 100.0,
  1491                0.05 * 100.0);
  1492       set_full_young_gcs(true);
  1493     } else if (adaptive_young_list_length() &&
  1494               (get_gc_eff_factor() * cur_efficiency < predict_young_gc_eff())) {
  1495       ergo_verbose5(ErgoPartiallyYoungGCs,
  1496                     "end partially-young GCs",
  1497                     ergo_format_reason("current GC efficiency lower than "
  1498                                        "predicted fully-young GC efficiency")
  1499                     ergo_format_double("GC efficiency factor")
  1500                     ergo_format_double("current GC efficiency")
  1501                     ergo_format_double("predicted fully-young GC efficiency")
  1502                     ergo_format_byte_perc("known garbage"),
  1503                     get_gc_eff_factor(), cur_efficiency,
  1504                     predict_young_gc_eff(),
  1505                     _known_garbage_bytes, _known_garbage_ratio * 100.0);
  1506       set_full_young_gcs(true);
  1509   _should_revert_to_full_young_gcs = false;
  1511   if (_last_young_gc_full && !_during_marking) {
  1512     _young_gc_eff_seq->add(cur_efficiency);
  1515   _short_lived_surv_rate_group->start_adding_regions();
  1516   // do that for any other surv rate groupsx
  1518   if (update_stats) {
  1519     double pause_time_ms = elapsed_ms;
  1521     size_t diff = 0;
  1522     if (_max_pending_cards >= _pending_cards)
  1523       diff = _max_pending_cards - _pending_cards;
  1524     _pending_card_diff_seq->add((double) diff);
  1526     double cost_per_card_ms = 0.0;
  1527     if (_pending_cards > 0) {
  1528       cost_per_card_ms = update_rs_time / (double) _pending_cards;
  1529       _cost_per_card_ms_seq->add(cost_per_card_ms);
  1532     size_t cards_scanned = _g1->cards_scanned();
  1534     double cost_per_entry_ms = 0.0;
  1535     if (cards_scanned > 10) {
  1536       cost_per_entry_ms = scan_rs_time / (double) cards_scanned;
  1537       if (_last_young_gc_full)
  1538         _cost_per_entry_ms_seq->add(cost_per_entry_ms);
  1539       else
  1540         _partially_young_cost_per_entry_ms_seq->add(cost_per_entry_ms);
  1543     if (_max_rs_lengths > 0) {
  1544       double cards_per_entry_ratio =
  1545         (double) cards_scanned / (double) _max_rs_lengths;
  1546       if (_last_young_gc_full)
  1547         _fully_young_cards_per_entry_ratio_seq->add(cards_per_entry_ratio);
  1548       else
  1549         _partially_young_cards_per_entry_ratio_seq->add(cards_per_entry_ratio);
  1552     size_t rs_length_diff = _max_rs_lengths - _recorded_rs_lengths;
  1553     if (rs_length_diff >= 0)
  1554       _rs_length_diff_seq->add((double) rs_length_diff);
  1556     size_t copied_bytes = surviving_bytes;
  1557     double cost_per_byte_ms = 0.0;
  1558     if (copied_bytes > 0) {
  1559       cost_per_byte_ms = obj_copy_time / (double) copied_bytes;
  1560       if (_in_marking_window)
  1561         _cost_per_byte_ms_during_cm_seq->add(cost_per_byte_ms);
  1562       else
  1563         _cost_per_byte_ms_seq->add(cost_per_byte_ms);
  1566     double all_other_time_ms = pause_time_ms -
  1567       (update_rs_time + scan_rs_time + obj_copy_time +
  1568        _mark_closure_time_ms + termination_time);
  1570     double young_other_time_ms = 0.0;
  1571     if (young_cset_region_length() > 0) {
  1572       young_other_time_ms =
  1573         _recorded_young_cset_choice_time_ms +
  1574         _recorded_young_free_cset_time_ms;
  1575       _young_other_cost_per_region_ms_seq->add(young_other_time_ms /
  1576                                           (double) young_cset_region_length());
  1578     double non_young_other_time_ms = 0.0;
  1579     if (old_cset_region_length() > 0) {
  1580       non_young_other_time_ms =
  1581         _recorded_non_young_cset_choice_time_ms +
  1582         _recorded_non_young_free_cset_time_ms;
  1584       _non_young_other_cost_per_region_ms_seq->add(non_young_other_time_ms /
  1585                                             (double) old_cset_region_length());
  1588     double constant_other_time_ms = all_other_time_ms -
  1589       (young_other_time_ms + non_young_other_time_ms);
  1590     _constant_other_time_ms_seq->add(constant_other_time_ms);
  1592     double survival_ratio = 0.0;
  1593     if (_bytes_in_collection_set_before_gc > 0) {
  1594       survival_ratio = (double) _bytes_copied_during_gc /
  1595                                    (double) _bytes_in_collection_set_before_gc;
  1598     _pending_cards_seq->add((double) _pending_cards);
  1599     _rs_lengths_seq->add((double) _max_rs_lengths);
  1601     double expensive_region_limit_ms =
  1602       (double) MaxGCPauseMillis - predict_constant_other_time_ms();
  1603     if (expensive_region_limit_ms < 0.0) {
  1604       // this means that the other time was predicted to be longer than
  1605       // than the max pause time
  1606       expensive_region_limit_ms = (double) MaxGCPauseMillis;
  1608     _expensive_region_limit_ms = expensive_region_limit_ms;
  1611   _in_marking_window = new_in_marking_window;
  1612   _in_marking_window_im = new_in_marking_window_im;
  1613   _free_regions_at_end_of_collection = _g1->free_regions();
  1614   update_young_list_target_length();
  1616   // Note that _mmu_tracker->max_gc_time() returns the time in seconds.
  1617   double update_rs_time_goal_ms = _mmu_tracker->max_gc_time() * MILLIUNITS * G1RSetUpdatingPauseTimePercent / 100.0;
  1618   adjust_concurrent_refinement(update_rs_time, update_rs_processed_buffers, update_rs_time_goal_ms);
  1620   assert(assertMarkedBytesDataOK(), "Marked regions not OK at pause end.");
  1623 #define EXT_SIZE_FORMAT "%d%s"
  1624 #define EXT_SIZE_PARAMS(bytes)                                  \
  1625   byte_size_in_proper_unit((bytes)),                            \
  1626   proper_unit_for_byte_size((bytes))
  1628 void G1CollectorPolicy::print_heap_transition() {
  1629   if (PrintGCDetails) {
  1630     YoungList* young_list = _g1->young_list();
  1631     size_t eden_bytes = young_list->eden_used_bytes();
  1632     size_t survivor_bytes = young_list->survivor_used_bytes();
  1633     size_t used_before_gc = _cur_collection_pause_used_at_start_bytes;
  1634     size_t used = _g1->used();
  1635     size_t capacity = _g1->capacity();
  1636     size_t eden_capacity =
  1637       (_young_list_target_length * HeapRegion::GrainBytes) - survivor_bytes;
  1639     gclog_or_tty->print_cr(
  1640       "   [Eden: "EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT")->"EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT") "
  1641       "Survivors: "EXT_SIZE_FORMAT"->"EXT_SIZE_FORMAT" "
  1642       "Heap: "EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT")->"
  1643       EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT")]",
  1644       EXT_SIZE_PARAMS(_eden_bytes_before_gc),
  1645       EXT_SIZE_PARAMS(_prev_eden_capacity),
  1646       EXT_SIZE_PARAMS(eden_bytes),
  1647       EXT_SIZE_PARAMS(eden_capacity),
  1648       EXT_SIZE_PARAMS(_survivor_bytes_before_gc),
  1649       EXT_SIZE_PARAMS(survivor_bytes),
  1650       EXT_SIZE_PARAMS(used_before_gc),
  1651       EXT_SIZE_PARAMS(_capacity_before_gc),
  1652       EXT_SIZE_PARAMS(used),
  1653       EXT_SIZE_PARAMS(capacity));
  1655     _prev_eden_capacity = eden_capacity;
  1656   } else if (PrintGC) {
  1657     _g1->print_size_transition(gclog_or_tty,
  1658                                _cur_collection_pause_used_at_start_bytes,
  1659                                _g1->used(), _g1->capacity());
  1663 void G1CollectorPolicy::adjust_concurrent_refinement(double update_rs_time,
  1664                                                      double update_rs_processed_buffers,
  1665                                                      double goal_ms) {
  1666   DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
  1667   ConcurrentG1Refine *cg1r = G1CollectedHeap::heap()->concurrent_g1_refine();
  1669   if (G1UseAdaptiveConcRefinement) {
  1670     const int k_gy = 3, k_gr = 6;
  1671     const double inc_k = 1.1, dec_k = 0.9;
  1673     int g = cg1r->green_zone();
  1674     if (update_rs_time > goal_ms) {
  1675       g = (int)(g * dec_k);  // Can become 0, that's OK. That would mean a mutator-only processing.
  1676     } else {
  1677       if (update_rs_time < goal_ms && update_rs_processed_buffers > g) {
  1678         g = (int)MAX2(g * inc_k, g + 1.0);
  1681     // Change the refinement threads params
  1682     cg1r->set_green_zone(g);
  1683     cg1r->set_yellow_zone(g * k_gy);
  1684     cg1r->set_red_zone(g * k_gr);
  1685     cg1r->reinitialize_threads();
  1687     int processing_threshold_delta = MAX2((int)(cg1r->green_zone() * sigma()), 1);
  1688     int processing_threshold = MIN2(cg1r->green_zone() + processing_threshold_delta,
  1689                                     cg1r->yellow_zone());
  1690     // Change the barrier params
  1691     dcqs.set_process_completed_threshold(processing_threshold);
  1692     dcqs.set_max_completed_queue(cg1r->red_zone());
  1695   int curr_queue_size = dcqs.completed_buffers_num();
  1696   if (curr_queue_size >= cg1r->yellow_zone()) {
  1697     dcqs.set_completed_queue_padding(curr_queue_size);
  1698   } else {
  1699     dcqs.set_completed_queue_padding(0);
  1701   dcqs.notify_if_necessary();
  1704 double
  1705 G1CollectorPolicy::
  1706 predict_young_collection_elapsed_time_ms(size_t adjustment) {
  1707   guarantee( adjustment == 0 || adjustment == 1, "invariant" );
  1709   G1CollectedHeap* g1h = G1CollectedHeap::heap();
  1710   size_t young_num = g1h->young_list()->length();
  1711   if (young_num == 0)
  1712     return 0.0;
  1714   young_num += adjustment;
  1715   size_t pending_cards = predict_pending_cards();
  1716   size_t rs_lengths = g1h->young_list()->sampled_rs_lengths() +
  1717                       predict_rs_length_diff();
  1718   size_t card_num;
  1719   if (full_young_gcs())
  1720     card_num = predict_young_card_num(rs_lengths);
  1721   else
  1722     card_num = predict_non_young_card_num(rs_lengths);
  1723   size_t young_byte_size = young_num * HeapRegion::GrainBytes;
  1724   double accum_yg_surv_rate =
  1725     _short_lived_surv_rate_group->accum_surv_rate(adjustment);
  1727   size_t bytes_to_copy =
  1728     (size_t) (accum_yg_surv_rate * (double) HeapRegion::GrainBytes);
  1730   return
  1731     predict_rs_update_time_ms(pending_cards) +
  1732     predict_rs_scan_time_ms(card_num) +
  1733     predict_object_copy_time_ms(bytes_to_copy) +
  1734     predict_young_other_time_ms(young_num) +
  1735     predict_constant_other_time_ms();
  1738 double
  1739 G1CollectorPolicy::predict_base_elapsed_time_ms(size_t pending_cards) {
  1740   size_t rs_length = predict_rs_length_diff();
  1741   size_t card_num;
  1742   if (full_young_gcs())
  1743     card_num = predict_young_card_num(rs_length);
  1744   else
  1745     card_num = predict_non_young_card_num(rs_length);
  1746   return predict_base_elapsed_time_ms(pending_cards, card_num);
  1749 double
  1750 G1CollectorPolicy::predict_base_elapsed_time_ms(size_t pending_cards,
  1751                                                 size_t scanned_cards) {
  1752   return
  1753     predict_rs_update_time_ms(pending_cards) +
  1754     predict_rs_scan_time_ms(scanned_cards) +
  1755     predict_constant_other_time_ms();
  1758 double
  1759 G1CollectorPolicy::predict_region_elapsed_time_ms(HeapRegion* hr,
  1760                                                   bool young) {
  1761   size_t rs_length = hr->rem_set()->occupied();
  1762   size_t card_num;
  1763   if (full_young_gcs())
  1764     card_num = predict_young_card_num(rs_length);
  1765   else
  1766     card_num = predict_non_young_card_num(rs_length);
  1767   size_t bytes_to_copy = predict_bytes_to_copy(hr);
  1769   double region_elapsed_time_ms =
  1770     predict_rs_scan_time_ms(card_num) +
  1771     predict_object_copy_time_ms(bytes_to_copy);
  1773   if (young)
  1774     region_elapsed_time_ms += predict_young_other_time_ms(1);
  1775   else
  1776     region_elapsed_time_ms += predict_non_young_other_time_ms(1);
  1778   return region_elapsed_time_ms;
  1781 size_t
  1782 G1CollectorPolicy::predict_bytes_to_copy(HeapRegion* hr) {
  1783   size_t bytes_to_copy;
  1784   if (hr->is_marked())
  1785     bytes_to_copy = hr->max_live_bytes();
  1786   else {
  1787     guarantee( hr->is_young() && hr->age_in_surv_rate_group() != -1,
  1788                "invariant" );
  1789     int age = hr->age_in_surv_rate_group();
  1790     double yg_surv_rate = predict_yg_surv_rate(age, hr->surv_rate_group());
  1791     bytes_to_copy = (size_t) ((double) hr->used() * yg_surv_rate);
  1794   return bytes_to_copy;
  1797 void
  1798 G1CollectorPolicy::init_cset_region_lengths(size_t eden_cset_region_length,
  1799                                           size_t survivor_cset_region_length) {
  1800   _eden_cset_region_length     = eden_cset_region_length;
  1801   _survivor_cset_region_length = survivor_cset_region_length;
  1802   _old_cset_region_length      = 0;
  1805 void G1CollectorPolicy::set_recorded_rs_lengths(size_t rs_lengths) {
  1806   _recorded_rs_lengths = rs_lengths;
  1809 void G1CollectorPolicy::check_if_region_is_too_expensive(double
  1810                                                            predicted_time_ms) {
  1811   // I don't think we need to do this when in young GC mode since
  1812   // marking will be initiated next time we hit the soft limit anyway...
  1813   if (predicted_time_ms > _expensive_region_limit_ms) {
  1814     ergo_verbose2(ErgoPartiallyYoungGCs,
  1815               "request partially-young GCs end",
  1816               ergo_format_reason("predicted region time higher than threshold")
  1817               ergo_format_ms("predicted region time")
  1818               ergo_format_ms("threshold"),
  1819               predicted_time_ms, _expensive_region_limit_ms);
  1820     // no point in doing another partial one
  1821     _should_revert_to_full_young_gcs = true;
  1825 void G1CollectorPolicy::update_recent_gc_times(double end_time_sec,
  1826                                                double elapsed_ms) {
  1827   _recent_gc_times_ms->add(elapsed_ms);
  1828   _recent_prev_end_times_for_all_gcs_sec->add(end_time_sec);
  1829   _prev_collection_pause_end_ms = end_time_sec * 1000.0;
  1832 size_t G1CollectorPolicy::expansion_amount() {
  1833   double recent_gc_overhead = recent_avg_pause_time_ratio() * 100.0;
  1834   double threshold = _gc_overhead_perc;
  1835   if (recent_gc_overhead > threshold) {
  1836     // We will double the existing space, or take
  1837     // G1ExpandByPercentOfAvailable % of the available expansion
  1838     // space, whichever is smaller, bounded below by a minimum
  1839     // expansion (unless that's all that's left.)
  1840     const size_t min_expand_bytes = 1*M;
  1841     size_t reserved_bytes = _g1->max_capacity();
  1842     size_t committed_bytes = _g1->capacity();
  1843     size_t uncommitted_bytes = reserved_bytes - committed_bytes;
  1844     size_t expand_bytes;
  1845     size_t expand_bytes_via_pct =
  1846       uncommitted_bytes * G1ExpandByPercentOfAvailable / 100;
  1847     expand_bytes = MIN2(expand_bytes_via_pct, committed_bytes);
  1848     expand_bytes = MAX2(expand_bytes, min_expand_bytes);
  1849     expand_bytes = MIN2(expand_bytes, uncommitted_bytes);
  1851     ergo_verbose5(ErgoHeapSizing,
  1852                   "attempt heap expansion",
  1853                   ergo_format_reason("recent GC overhead higher than "
  1854                                      "threshold after GC")
  1855                   ergo_format_perc("recent GC overhead")
  1856                   ergo_format_perc("threshold")
  1857                   ergo_format_byte("uncommitted")
  1858                   ergo_format_byte_perc("calculated expansion amount"),
  1859                   recent_gc_overhead, threshold,
  1860                   uncommitted_bytes,
  1861                   expand_bytes_via_pct, (double) G1ExpandByPercentOfAvailable);
  1863     return expand_bytes;
  1864   } else {
  1865     return 0;
  1869 class CountCSClosure: public HeapRegionClosure {
  1870   G1CollectorPolicy* _g1_policy;
  1871 public:
  1872   CountCSClosure(G1CollectorPolicy* g1_policy) :
  1873     _g1_policy(g1_policy) {}
  1874   bool doHeapRegion(HeapRegion* r) {
  1875     _g1_policy->_bytes_in_collection_set_before_gc += r->used();
  1876     return false;
  1878 };
  1880 void G1CollectorPolicy::count_CS_bytes_used() {
  1881   CountCSClosure cs_closure(this);
  1882   _g1->collection_set_iterate(&cs_closure);
  1885 void G1CollectorPolicy::print_summary(int level,
  1886                                       const char* str,
  1887                                       NumberSeq* seq) const {
  1888   double sum = seq->sum();
  1889   LineBuffer(level + 1).append_and_print_cr("%-24s = %8.2lf s (avg = %8.2lf ms)",
  1890                 str, sum / 1000.0, seq->avg());
  1893 void G1CollectorPolicy::print_summary_sd(int level,
  1894                                          const char* str,
  1895                                          NumberSeq* seq) const {
  1896   print_summary(level, str, seq);
  1897   LineBuffer(level + 6).append_and_print_cr("(num = %5d, std dev = %8.2lf ms, max = %8.2lf ms)",
  1898                 seq->num(), seq->sd(), seq->maximum());
  1901 void G1CollectorPolicy::check_other_times(int level,
  1902                                         NumberSeq* other_times_ms,
  1903                                         NumberSeq* calc_other_times_ms) const {
  1904   bool should_print = false;
  1905   LineBuffer buf(level + 2);
  1907   double max_sum = MAX2(fabs(other_times_ms->sum()),
  1908                         fabs(calc_other_times_ms->sum()));
  1909   double min_sum = MIN2(fabs(other_times_ms->sum()),
  1910                         fabs(calc_other_times_ms->sum()));
  1911   double sum_ratio = max_sum / min_sum;
  1912   if (sum_ratio > 1.1) {
  1913     should_print = true;
  1914     buf.append_and_print_cr("## CALCULATED OTHER SUM DOESN'T MATCH RECORDED ###");
  1917   double max_avg = MAX2(fabs(other_times_ms->avg()),
  1918                         fabs(calc_other_times_ms->avg()));
  1919   double min_avg = MIN2(fabs(other_times_ms->avg()),
  1920                         fabs(calc_other_times_ms->avg()));
  1921   double avg_ratio = max_avg / min_avg;
  1922   if (avg_ratio > 1.1) {
  1923     should_print = true;
  1924     buf.append_and_print_cr("## CALCULATED OTHER AVG DOESN'T MATCH RECORDED ###");
  1927   if (other_times_ms->sum() < -0.01) {
  1928     buf.append_and_print_cr("## RECORDED OTHER SUM IS NEGATIVE ###");
  1931   if (other_times_ms->avg() < -0.01) {
  1932     buf.append_and_print_cr("## RECORDED OTHER AVG IS NEGATIVE ###");
  1935   if (calc_other_times_ms->sum() < -0.01) {
  1936     should_print = true;
  1937     buf.append_and_print_cr("## CALCULATED OTHER SUM IS NEGATIVE ###");
  1940   if (calc_other_times_ms->avg() < -0.01) {
  1941     should_print = true;
  1942     buf.append_and_print_cr("## CALCULATED OTHER AVG IS NEGATIVE ###");
  1945   if (should_print)
  1946     print_summary(level, "Other(Calc)", calc_other_times_ms);
  1949 void G1CollectorPolicy::print_summary(PauseSummary* summary) const {
  1950   bool parallel = G1CollectedHeap::use_parallel_gc_threads();
  1951   MainBodySummary*    body_summary = summary->main_body_summary();
  1952   if (summary->get_total_seq()->num() > 0) {
  1953     print_summary_sd(0, "Evacuation Pauses", summary->get_total_seq());
  1954     if (body_summary != NULL) {
  1955       print_summary(1, "SATB Drain", body_summary->get_satb_drain_seq());
  1956       if (parallel) {
  1957         print_summary(1, "Parallel Time", body_summary->get_parallel_seq());
  1958         print_summary(2, "Ext Root Scanning", body_summary->get_ext_root_scan_seq());
  1959         print_summary(2, "Mark Stack Scanning", body_summary->get_mark_stack_scan_seq());
  1960         print_summary(2, "Update RS", body_summary->get_update_rs_seq());
  1961         print_summary(2, "Scan RS", body_summary->get_scan_rs_seq());
  1962         print_summary(2, "Object Copy", body_summary->get_obj_copy_seq());
  1963         print_summary(2, "Termination", body_summary->get_termination_seq());
  1964         print_summary(2, "Parallel Other", body_summary->get_parallel_other_seq());
  1966           NumberSeq* other_parts[] = {
  1967             body_summary->get_ext_root_scan_seq(),
  1968             body_summary->get_mark_stack_scan_seq(),
  1969             body_summary->get_update_rs_seq(),
  1970             body_summary->get_scan_rs_seq(),
  1971             body_summary->get_obj_copy_seq(),
  1972             body_summary->get_termination_seq()
  1973           };
  1974           NumberSeq calc_other_times_ms(body_summary->get_parallel_seq(),
  1975                                         6, other_parts);
  1976           check_other_times(2, body_summary->get_parallel_other_seq(),
  1977                             &calc_other_times_ms);
  1979       } else {
  1980         print_summary(1, "Ext Root Scanning", body_summary->get_ext_root_scan_seq());
  1981         print_summary(1, "Mark Stack Scanning", body_summary->get_mark_stack_scan_seq());
  1982         print_summary(1, "Update RS", body_summary->get_update_rs_seq());
  1983         print_summary(1, "Scan RS", body_summary->get_scan_rs_seq());
  1984         print_summary(1, "Object Copy", body_summary->get_obj_copy_seq());
  1987     print_summary(1, "Mark Closure", body_summary->get_mark_closure_seq());
  1988     print_summary(1, "Clear CT", body_summary->get_clear_ct_seq());
  1989     print_summary(1, "Other", summary->get_other_seq());
  1991       if (body_summary != NULL) {
  1992         NumberSeq calc_other_times_ms;
  1993         if (parallel) {
  1994           // parallel
  1995           NumberSeq* other_parts[] = {
  1996             body_summary->get_satb_drain_seq(),
  1997             body_summary->get_parallel_seq(),
  1998             body_summary->get_clear_ct_seq()
  1999           };
  2000           calc_other_times_ms = NumberSeq(summary->get_total_seq(),
  2001                                                 3, other_parts);
  2002         } else {
  2003           // serial
  2004           NumberSeq* other_parts[] = {
  2005             body_summary->get_satb_drain_seq(),
  2006             body_summary->get_update_rs_seq(),
  2007             body_summary->get_ext_root_scan_seq(),
  2008             body_summary->get_mark_stack_scan_seq(),
  2009             body_summary->get_scan_rs_seq(),
  2010             body_summary->get_obj_copy_seq()
  2011           };
  2012           calc_other_times_ms = NumberSeq(summary->get_total_seq(),
  2013                                                 6, other_parts);
  2015         check_other_times(1,  summary->get_other_seq(), &calc_other_times_ms);
  2018   } else {
  2019     LineBuffer(1).append_and_print_cr("none");
  2021   LineBuffer(0).append_and_print_cr("");
  2024 void G1CollectorPolicy::print_tracing_info() const {
  2025   if (TraceGen0Time) {
  2026     gclog_or_tty->print_cr("ALL PAUSES");
  2027     print_summary_sd(0, "Total", _all_pause_times_ms);
  2028     gclog_or_tty->print_cr("");
  2029     gclog_or_tty->print_cr("");
  2030     gclog_or_tty->print_cr("   Full Young GC Pauses:    %8d", _full_young_pause_num);
  2031     gclog_or_tty->print_cr("   Partial Young GC Pauses: %8d", _partial_young_pause_num);
  2032     gclog_or_tty->print_cr("");
  2034     gclog_or_tty->print_cr("EVACUATION PAUSES");
  2035     print_summary(_summary);
  2037     gclog_or_tty->print_cr("MISC");
  2038     print_summary_sd(0, "Stop World", _all_stop_world_times_ms);
  2039     print_summary_sd(0, "Yields", _all_yield_times_ms);
  2040     for (int i = 0; i < _aux_num; ++i) {
  2041       if (_all_aux_times_ms[i].num() > 0) {
  2042         char buffer[96];
  2043         sprintf(buffer, "Aux%d", i);
  2044         print_summary_sd(0, buffer, &_all_aux_times_ms[i]);
  2048   if (TraceGen1Time) {
  2049     if (_all_full_gc_times_ms->num() > 0) {
  2050       gclog_or_tty->print("\n%4d full_gcs: total time = %8.2f s",
  2051                  _all_full_gc_times_ms->num(),
  2052                  _all_full_gc_times_ms->sum() / 1000.0);
  2053       gclog_or_tty->print_cr(" (avg = %8.2fms).", _all_full_gc_times_ms->avg());
  2054       gclog_or_tty->print_cr("                     [std. dev = %8.2f ms, max = %8.2f ms]",
  2055                     _all_full_gc_times_ms->sd(),
  2056                     _all_full_gc_times_ms->maximum());
  2061 void G1CollectorPolicy::print_yg_surv_rate_info() const {
  2062 #ifndef PRODUCT
  2063   _short_lived_surv_rate_group->print_surv_rate_summary();
  2064   // add this call for any other surv rate groups
  2065 #endif // PRODUCT
  2068 #ifndef PRODUCT
  2069 // for debugging, bit of a hack...
  2070 static char*
  2071 region_num_to_mbs(int length) {
  2072   static char buffer[64];
  2073   double bytes = (double) (length * HeapRegion::GrainBytes);
  2074   double mbs = bytes / (double) (1024 * 1024);
  2075   sprintf(buffer, "%7.2lfMB", mbs);
  2076   return buffer;
  2078 #endif // PRODUCT
  2080 size_t G1CollectorPolicy::max_regions(int purpose) {
  2081   switch (purpose) {
  2082     case GCAllocForSurvived:
  2083       return _max_survivor_regions;
  2084     case GCAllocForTenured:
  2085       return REGIONS_UNLIMITED;
  2086     default:
  2087       ShouldNotReachHere();
  2088       return REGIONS_UNLIMITED;
  2089   };
  2092 void G1CollectorPolicy::update_max_gc_locker_expansion() {
  2093   size_t expansion_region_num = 0;
  2094   if (GCLockerEdenExpansionPercent > 0) {
  2095     double perc = (double) GCLockerEdenExpansionPercent / 100.0;
  2096     double expansion_region_num_d = perc * (double) _young_list_target_length;
  2097     // We use ceiling so that if expansion_region_num_d is > 0.0 (but
  2098     // less than 1.0) we'll get 1.
  2099     expansion_region_num = (size_t) ceil(expansion_region_num_d);
  2100   } else {
  2101     assert(expansion_region_num == 0, "sanity");
  2103   _young_list_max_length = _young_list_target_length + expansion_region_num;
  2104   assert(_young_list_target_length <= _young_list_max_length, "post-condition");
  2107 // Calculates survivor space parameters.
  2108 void G1CollectorPolicy::update_survivors_policy() {
  2109   double max_survivor_regions_d =
  2110                  (double) _young_list_target_length / (double) SurvivorRatio;
  2111   // We use ceiling so that if max_survivor_regions_d is > 0.0 (but
  2112   // smaller than 1.0) we'll get 1.
  2113   _max_survivor_regions = (size_t) ceil(max_survivor_regions_d);
  2115   _tenuring_threshold = _survivors_age_table.compute_tenuring_threshold(
  2116         HeapRegion::GrainWords * _max_survivor_regions);
  2119 #ifndef PRODUCT
  2120 class HRSortIndexIsOKClosure: public HeapRegionClosure {
  2121   CollectionSetChooser* _chooser;
  2122 public:
  2123   HRSortIndexIsOKClosure(CollectionSetChooser* chooser) :
  2124     _chooser(chooser) {}
  2126   bool doHeapRegion(HeapRegion* r) {
  2127     if (!r->continuesHumongous()) {
  2128       assert(_chooser->regionProperlyOrdered(r), "Ought to be.");
  2130     return false;
  2132 };
  2134 bool G1CollectorPolicy::assertMarkedBytesDataOK() {
  2135   HRSortIndexIsOKClosure cl(_collectionSetChooser);
  2136   _g1->heap_region_iterate(&cl);
  2137   return true;
  2139 #endif
  2141 bool G1CollectorPolicy::force_initial_mark_if_outside_cycle(
  2142                                                      GCCause::Cause gc_cause) {
  2143   bool during_cycle = _g1->concurrent_mark()->cmThread()->during_cycle();
  2144   if (!during_cycle) {
  2145     ergo_verbose1(ErgoConcCycles,
  2146                   "request concurrent cycle initiation",
  2147                   ergo_format_reason("requested by GC cause")
  2148                   ergo_format_str("GC cause"),
  2149                   GCCause::to_string(gc_cause));
  2150     set_initiate_conc_mark_if_possible();
  2151     return true;
  2152   } else {
  2153     ergo_verbose1(ErgoConcCycles,
  2154                   "do not request concurrent cycle initiation",
  2155                   ergo_format_reason("concurrent cycle already in progress")
  2156                   ergo_format_str("GC cause"),
  2157                   GCCause::to_string(gc_cause));
  2158     return false;
  2162 void
  2163 G1CollectorPolicy::decide_on_conc_mark_initiation() {
  2164   // We are about to decide on whether this pause will be an
  2165   // initial-mark pause.
  2167   // First, during_initial_mark_pause() should not be already set. We
  2168   // will set it here if we have to. However, it should be cleared by
  2169   // the end of the pause (it's only set for the duration of an
  2170   // initial-mark pause).
  2171   assert(!during_initial_mark_pause(), "pre-condition");
  2173   if (initiate_conc_mark_if_possible()) {
  2174     // We had noticed on a previous pause that the heap occupancy has
  2175     // gone over the initiating threshold and we should start a
  2176     // concurrent marking cycle. So we might initiate one.
  2178     bool during_cycle = _g1->concurrent_mark()->cmThread()->during_cycle();
  2179     if (!during_cycle) {
  2180       // The concurrent marking thread is not "during a cycle", i.e.,
  2181       // it has completed the last one. So we can go ahead and
  2182       // initiate a new cycle.
  2184       set_during_initial_mark_pause();
  2185       // We do not allow non-full young GCs during marking.
  2186       if (!full_young_gcs()) {
  2187         set_full_young_gcs(true);
  2188         ergo_verbose0(ErgoPartiallyYoungGCs,
  2189                       "end partially-young GCs",
  2190                       ergo_format_reason("concurrent cycle is about to start"));
  2193       // And we can now clear initiate_conc_mark_if_possible() as
  2194       // we've already acted on it.
  2195       clear_initiate_conc_mark_if_possible();
  2197       ergo_verbose0(ErgoConcCycles,
  2198                   "initiate concurrent cycle",
  2199                   ergo_format_reason("concurrent cycle initiation requested"));
  2200     } else {
  2201       // The concurrent marking thread is still finishing up the
  2202       // previous cycle. If we start one right now the two cycles
  2203       // overlap. In particular, the concurrent marking thread might
  2204       // be in the process of clearing the next marking bitmap (which
  2205       // we will use for the next cycle if we start one). Starting a
  2206       // cycle now will be bad given that parts of the marking
  2207       // information might get cleared by the marking thread. And we
  2208       // cannot wait for the marking thread to finish the cycle as it
  2209       // periodically yields while clearing the next marking bitmap
  2210       // and, if it's in a yield point, it's waiting for us to
  2211       // finish. So, at this point we will not start a cycle and we'll
  2212       // let the concurrent marking thread complete the last one.
  2213       ergo_verbose0(ErgoConcCycles,
  2214                     "do not initiate concurrent cycle",
  2215                     ergo_format_reason("concurrent cycle already in progress"));
  2220 class KnownGarbageClosure: public HeapRegionClosure {
  2221   CollectionSetChooser* _hrSorted;
  2223 public:
  2224   KnownGarbageClosure(CollectionSetChooser* hrSorted) :
  2225     _hrSorted(hrSorted)
  2226   {}
  2228   bool doHeapRegion(HeapRegion* r) {
  2229     // We only include humongous regions in collection
  2230     // sets when concurrent mark shows that their contained object is
  2231     // unreachable.
  2233     // Do we have any marking information for this region?
  2234     if (r->is_marked()) {
  2235       // We don't include humongous regions in collection
  2236       // sets because we collect them immediately at the end of a marking
  2237       // cycle.  We also don't include young regions because we *must*
  2238       // include them in the next collection pause.
  2239       if (!r->isHumongous() && !r->is_young()) {
  2240         _hrSorted->addMarkedHeapRegion(r);
  2243     return false;
  2245 };
  2247 class ParKnownGarbageHRClosure: public HeapRegionClosure {
  2248   CollectionSetChooser* _hrSorted;
  2249   jint _marked_regions_added;
  2250   jint _chunk_size;
  2251   jint _cur_chunk_idx;
  2252   jint _cur_chunk_end; // Cur chunk [_cur_chunk_idx, _cur_chunk_end)
  2253   int _worker;
  2254   int _invokes;
  2256   void get_new_chunk() {
  2257     _cur_chunk_idx = _hrSorted->getParMarkedHeapRegionChunk(_chunk_size);
  2258     _cur_chunk_end = _cur_chunk_idx + _chunk_size;
  2260   void add_region(HeapRegion* r) {
  2261     if (_cur_chunk_idx == _cur_chunk_end) {
  2262       get_new_chunk();
  2264     assert(_cur_chunk_idx < _cur_chunk_end, "postcondition");
  2265     _hrSorted->setMarkedHeapRegion(_cur_chunk_idx, r);
  2266     _marked_regions_added++;
  2267     _cur_chunk_idx++;
  2270 public:
  2271   ParKnownGarbageHRClosure(CollectionSetChooser* hrSorted,
  2272                            jint chunk_size,
  2273                            int worker) :
  2274     _hrSorted(hrSorted), _chunk_size(chunk_size), _worker(worker),
  2275     _marked_regions_added(0), _cur_chunk_idx(0), _cur_chunk_end(0),
  2276     _invokes(0)
  2277   {}
  2279   bool doHeapRegion(HeapRegion* r) {
  2280     // We only include humongous regions in collection
  2281     // sets when concurrent mark shows that their contained object is
  2282     // unreachable.
  2283     _invokes++;
  2285     // Do we have any marking information for this region?
  2286     if (r->is_marked()) {
  2287       // We don't include humongous regions in collection
  2288       // sets because we collect them immediately at the end of a marking
  2289       // cycle.
  2290       // We also do not include young regions in collection sets
  2291       if (!r->isHumongous() && !r->is_young()) {
  2292         add_region(r);
  2295     return false;
  2297   jint marked_regions_added() { return _marked_regions_added; }
  2298   int invokes() { return _invokes; }
  2299 };
  2301 class ParKnownGarbageTask: public AbstractGangTask {
  2302   CollectionSetChooser* _hrSorted;
  2303   jint _chunk_size;
  2304   G1CollectedHeap* _g1;
  2305 public:
  2306   ParKnownGarbageTask(CollectionSetChooser* hrSorted, jint chunk_size) :
  2307     AbstractGangTask("ParKnownGarbageTask"),
  2308     _hrSorted(hrSorted), _chunk_size(chunk_size),
  2309     _g1(G1CollectedHeap::heap())
  2310   {}
  2312   void work(int i) {
  2313     ParKnownGarbageHRClosure parKnownGarbageCl(_hrSorted, _chunk_size, i);
  2314     // Back to zero for the claim value.
  2315     _g1->heap_region_par_iterate_chunked(&parKnownGarbageCl, i,
  2316                                          _g1->workers()->active_workers(),
  2317                                          HeapRegion::InitialClaimValue);
  2318     jint regions_added = parKnownGarbageCl.marked_regions_added();
  2319     _hrSorted->incNumMarkedHeapRegions(regions_added);
  2320     if (G1PrintParCleanupStats) {
  2321       gclog_or_tty->print_cr("     Thread %d called %d times, added %d regions to list.",
  2322                  i, parKnownGarbageCl.invokes(), regions_added);
  2325 };
  2327 void
  2328 G1CollectorPolicy::record_concurrent_mark_cleanup_end(int no_of_gc_threads) {
  2329   double start_sec;
  2330   if (G1PrintParCleanupStats) {
  2331     start_sec = os::elapsedTime();
  2334   _collectionSetChooser->clearMarkedHeapRegions();
  2335   double clear_marked_end_sec;
  2336   if (G1PrintParCleanupStats) {
  2337     clear_marked_end_sec = os::elapsedTime();
  2338     gclog_or_tty->print_cr("  clear marked regions: %8.3f ms.",
  2339                            (clear_marked_end_sec - start_sec) * 1000.0);
  2342   if (G1CollectedHeap::use_parallel_gc_threads()) {
  2343     const size_t OverpartitionFactor = 4;
  2344     size_t WorkUnit;
  2345     // The use of MinChunkSize = 8 in the original code
  2346     // causes some assertion failures when the total number of
  2347     // region is less than 8.  The code here tries to fix that.
  2348     // Should the original code also be fixed?
  2349     if (no_of_gc_threads > 0) {
  2350       const size_t MinWorkUnit =
  2351         MAX2(_g1->n_regions() / no_of_gc_threads, (size_t) 1U);
  2352       WorkUnit =
  2353         MAX2(_g1->n_regions() / (no_of_gc_threads * OverpartitionFactor),
  2354              MinWorkUnit);
  2355     } else {
  2356       assert(no_of_gc_threads > 0,
  2357         "The active gc workers should be greater than 0");
  2358       // In a product build do something reasonable to avoid a crash.
  2359       const size_t MinWorkUnit =
  2360         MAX2(_g1->n_regions() / ParallelGCThreads, (size_t) 1U);
  2361       WorkUnit =
  2362         MAX2(_g1->n_regions() / (ParallelGCThreads * OverpartitionFactor),
  2363              MinWorkUnit);
  2365     _collectionSetChooser->prepareForAddMarkedHeapRegionsPar(_g1->n_regions(),
  2366                                                              WorkUnit);
  2367     ParKnownGarbageTask parKnownGarbageTask(_collectionSetChooser,
  2368                                             (int) WorkUnit);
  2369     _g1->workers()->run_task(&parKnownGarbageTask);
  2371     assert(_g1->check_heap_region_claim_values(HeapRegion::InitialClaimValue),
  2372            "sanity check");
  2373   } else {
  2374     KnownGarbageClosure knownGarbagecl(_collectionSetChooser);
  2375     _g1->heap_region_iterate(&knownGarbagecl);
  2377   double known_garbage_end_sec;
  2378   if (G1PrintParCleanupStats) {
  2379     known_garbage_end_sec = os::elapsedTime();
  2380     gclog_or_tty->print_cr("  compute known garbage: %8.3f ms.",
  2381                       (known_garbage_end_sec - clear_marked_end_sec) * 1000.0);
  2384   _collectionSetChooser->sortMarkedHeapRegions();
  2385   double end_sec = os::elapsedTime();
  2386   if (G1PrintParCleanupStats) {
  2387     gclog_or_tty->print_cr("  sorting: %8.3f ms.",
  2388                            (end_sec - known_garbage_end_sec) * 1000.0);
  2391   double elapsed_time_ms = (end_sec - _mark_cleanup_start_sec) * 1000.0;
  2392   _concurrent_mark_cleanup_times_ms->add(elapsed_time_ms);
  2393   _cur_mark_stop_world_time_ms += elapsed_time_ms;
  2394   _prev_collection_pause_end_ms += elapsed_time_ms;
  2395   _mmu_tracker->add_pause(_mark_cleanup_start_sec, end_sec, true);
  2398 // Add the heap region at the head of the non-incremental collection set
  2399 void G1CollectorPolicy::add_old_region_to_cset(HeapRegion* hr) {
  2400   assert(_inc_cset_build_state == Active, "Precondition");
  2401   assert(!hr->is_young(), "non-incremental add of young region");
  2403   if (_g1->mark_in_progress())
  2404     _g1->concurrent_mark()->registerCSetRegion(hr);
  2406   assert(!hr->in_collection_set(), "should not already be in the CSet");
  2407   hr->set_in_collection_set(true);
  2408   hr->set_next_in_collection_set(_collection_set);
  2409   _collection_set = hr;
  2410   _collection_set_bytes_used_before += hr->used();
  2411   _g1->register_region_with_in_cset_fast_test(hr);
  2412   size_t rs_length = hr->rem_set()->occupied();
  2413   _recorded_rs_lengths += rs_length;
  2414   _old_cset_region_length += 1;
  2417 // Initialize the per-collection-set information
  2418 void G1CollectorPolicy::start_incremental_cset_building() {
  2419   assert(_inc_cset_build_state == Inactive, "Precondition");
  2421   _inc_cset_head = NULL;
  2422   _inc_cset_tail = NULL;
  2423   _inc_cset_bytes_used_before = 0;
  2425   _inc_cset_max_finger = 0;
  2426   _inc_cset_recorded_rs_lengths = 0;
  2427   _inc_cset_predicted_elapsed_time_ms = 0;
  2428   _inc_cset_build_state = Active;
  2431 void G1CollectorPolicy::add_to_incremental_cset_info(HeapRegion* hr, size_t rs_length) {
  2432   // This routine is used when:
  2433   // * adding survivor regions to the incremental cset at the end of an
  2434   //   evacuation pause,
  2435   // * adding the current allocation region to the incremental cset
  2436   //   when it is retired, and
  2437   // * updating existing policy information for a region in the
  2438   //   incremental cset via young list RSet sampling.
  2439   // Therefore this routine may be called at a safepoint by the
  2440   // VM thread, or in-between safepoints by mutator threads (when
  2441   // retiring the current allocation region) or a concurrent
  2442   // refine thread (RSet sampling).
  2444   double region_elapsed_time_ms = predict_region_elapsed_time_ms(hr, true);
  2445   size_t used_bytes = hr->used();
  2447   _inc_cset_recorded_rs_lengths += rs_length;
  2448   _inc_cset_predicted_elapsed_time_ms += region_elapsed_time_ms;
  2450   _inc_cset_bytes_used_before += used_bytes;
  2452   // Cache the values we have added to the aggregated informtion
  2453   // in the heap region in case we have to remove this region from
  2454   // the incremental collection set, or it is updated by the
  2455   // rset sampling code
  2456   hr->set_recorded_rs_length(rs_length);
  2457   hr->set_predicted_elapsed_time_ms(region_elapsed_time_ms);
  2460 void G1CollectorPolicy::remove_from_incremental_cset_info(HeapRegion* hr) {
  2461   // This routine is currently only called as part of the updating of
  2462   // existing policy information for regions in the incremental cset that
  2463   // is performed by the concurrent refine thread(s) as part of young list
  2464   // RSet sampling. Therefore we should not be at a safepoint.
  2466   assert(!SafepointSynchronize::is_at_safepoint(), "should not be at safepoint");
  2467   assert(hr->is_young(), "it should be");
  2469   size_t used_bytes = hr->used();
  2470   size_t old_rs_length = hr->recorded_rs_length();
  2471   double old_elapsed_time_ms = hr->predicted_elapsed_time_ms();
  2473   // Subtract the old recorded/predicted policy information for
  2474   // the given heap region from the collection set info.
  2475   _inc_cset_recorded_rs_lengths -= old_rs_length;
  2476   _inc_cset_predicted_elapsed_time_ms -= old_elapsed_time_ms;
  2478   _inc_cset_bytes_used_before -= used_bytes;
  2480   // Clear the values cached in the heap region
  2481   hr->set_recorded_rs_length(0);
  2482   hr->set_predicted_elapsed_time_ms(0);
  2485 void G1CollectorPolicy::update_incremental_cset_info(HeapRegion* hr, size_t new_rs_length) {
  2486   // Update the collection set information that is dependent on the new RS length
  2487   assert(hr->is_young(), "Precondition");
  2489   remove_from_incremental_cset_info(hr);
  2490   add_to_incremental_cset_info(hr, new_rs_length);
  2493 void G1CollectorPolicy::add_region_to_incremental_cset_common(HeapRegion* hr) {
  2494   assert(hr->is_young(), "invariant");
  2495   assert(hr->young_index_in_cset() > -1, "should have already been set");
  2496   assert(_inc_cset_build_state == Active, "Precondition");
  2498   // We need to clear and set the cached recorded/cached collection set
  2499   // information in the heap region here (before the region gets added
  2500   // to the collection set). An individual heap region's cached values
  2501   // are calculated, aggregated with the policy collection set info,
  2502   // and cached in the heap region here (initially) and (subsequently)
  2503   // by the Young List sampling code.
  2505   size_t rs_length = hr->rem_set()->occupied();
  2506   add_to_incremental_cset_info(hr, rs_length);
  2508   HeapWord* hr_end = hr->end();
  2509   _inc_cset_max_finger = MAX2(_inc_cset_max_finger, hr_end);
  2511   assert(!hr->in_collection_set(), "invariant");
  2512   hr->set_in_collection_set(true);
  2513   assert( hr->next_in_collection_set() == NULL, "invariant");
  2515   _g1->register_region_with_in_cset_fast_test(hr);
  2518 // Add the region at the RHS of the incremental cset
  2519 void G1CollectorPolicy::add_region_to_incremental_cset_rhs(HeapRegion* hr) {
  2520   // We should only ever be appending survivors at the end of a pause
  2521   assert( hr->is_survivor(), "Logic");
  2523   // Do the 'common' stuff
  2524   add_region_to_incremental_cset_common(hr);
  2526   // Now add the region at the right hand side
  2527   if (_inc_cset_tail == NULL) {
  2528     assert(_inc_cset_head == NULL, "invariant");
  2529     _inc_cset_head = hr;
  2530   } else {
  2531     _inc_cset_tail->set_next_in_collection_set(hr);
  2533   _inc_cset_tail = hr;
  2536 // Add the region to the LHS of the incremental cset
  2537 void G1CollectorPolicy::add_region_to_incremental_cset_lhs(HeapRegion* hr) {
  2538   // Survivors should be added to the RHS at the end of a pause
  2539   assert(!hr->is_survivor(), "Logic");
  2541   // Do the 'common' stuff
  2542   add_region_to_incremental_cset_common(hr);
  2544   // Add the region at the left hand side
  2545   hr->set_next_in_collection_set(_inc_cset_head);
  2546   if (_inc_cset_head == NULL) {
  2547     assert(_inc_cset_tail == NULL, "Invariant");
  2548     _inc_cset_tail = hr;
  2550   _inc_cset_head = hr;
  2553 #ifndef PRODUCT
  2554 void G1CollectorPolicy::print_collection_set(HeapRegion* list_head, outputStream* st) {
  2555   assert(list_head == inc_cset_head() || list_head == collection_set(), "must be");
  2557   st->print_cr("\nCollection_set:");
  2558   HeapRegion* csr = list_head;
  2559   while (csr != NULL) {
  2560     HeapRegion* next = csr->next_in_collection_set();
  2561     assert(csr->in_collection_set(), "bad CS");
  2562     st->print_cr("  [%08x-%08x], t: %08x, P: %08x, N: %08x, C: %08x, "
  2563                  "age: %4d, y: %d, surv: %d",
  2564                         csr->bottom(), csr->end(),
  2565                         csr->top(),
  2566                         csr->prev_top_at_mark_start(),
  2567                         csr->next_top_at_mark_start(),
  2568                         csr->top_at_conc_mark_count(),
  2569                         csr->age_in_surv_rate_group_cond(),
  2570                         csr->is_young(),
  2571                         csr->is_survivor());
  2572     csr = next;
  2575 #endif // !PRODUCT
  2577 void G1CollectorPolicy::choose_collection_set(double target_pause_time_ms) {
  2578   // Set this here - in case we're not doing young collections.
  2579   double non_young_start_time_sec = os::elapsedTime();
  2581   YoungList* young_list = _g1->young_list();
  2583   guarantee(target_pause_time_ms > 0.0,
  2584             err_msg("target_pause_time_ms = %1.6lf should be positive",
  2585                     target_pause_time_ms));
  2586   guarantee(_collection_set == NULL, "Precondition");
  2588   double base_time_ms = predict_base_elapsed_time_ms(_pending_cards);
  2589   double predicted_pause_time_ms = base_time_ms;
  2591   double time_remaining_ms = target_pause_time_ms - base_time_ms;
  2593   ergo_verbose3(ErgoCSetConstruction | ErgoHigh,
  2594                 "start choosing CSet",
  2595                 ergo_format_ms("predicted base time")
  2596                 ergo_format_ms("remaining time")
  2597                 ergo_format_ms("target pause time"),
  2598                 base_time_ms, time_remaining_ms, target_pause_time_ms);
  2600   // the 10% and 50% values are arbitrary...
  2601   double threshold = 0.10 * target_pause_time_ms;
  2602   if (time_remaining_ms < threshold) {
  2603     double prev_time_remaining_ms = time_remaining_ms;
  2604     time_remaining_ms = 0.50 * target_pause_time_ms;
  2605     ergo_verbose3(ErgoCSetConstruction,
  2606                   "adjust remaining time",
  2607                   ergo_format_reason("remaining time lower than threshold")
  2608                   ergo_format_ms("remaining time")
  2609                   ergo_format_ms("threshold")
  2610                   ergo_format_ms("adjusted remaining time"),
  2611                   prev_time_remaining_ms, threshold, time_remaining_ms);
  2614   size_t expansion_bytes = _g1->expansion_regions() * HeapRegion::GrainBytes;
  2616   HeapRegion* hr;
  2617   double young_start_time_sec = os::elapsedTime();
  2619   _collection_set_bytes_used_before = 0;
  2620   _last_young_gc_full = full_young_gcs() ? true : false;
  2622   if (_last_young_gc_full) {
  2623     ++_full_young_pause_num;
  2624   } else {
  2625     ++_partial_young_pause_num;
  2628   // The young list is laid with the survivor regions from the previous
  2629   // pause are appended to the RHS of the young list, i.e.
  2630   //   [Newly Young Regions ++ Survivors from last pause].
  2632   size_t survivor_region_length = young_list->survivor_length();
  2633   size_t eden_region_length = young_list->length() - survivor_region_length;
  2634   init_cset_region_lengths(eden_region_length, survivor_region_length);
  2635   hr = young_list->first_survivor_region();
  2636   while (hr != NULL) {
  2637     assert(hr->is_survivor(), "badly formed young list");
  2638     hr->set_young();
  2639     hr = hr->get_next_young_region();
  2642   // Clear the fields that point to the survivor list - they are all young now.
  2643   young_list->clear_survivors();
  2645   if (_g1->mark_in_progress())
  2646     _g1->concurrent_mark()->register_collection_set_finger(_inc_cset_max_finger);
  2648   _collection_set = _inc_cset_head;
  2649   _collection_set_bytes_used_before = _inc_cset_bytes_used_before;
  2650   time_remaining_ms -= _inc_cset_predicted_elapsed_time_ms;
  2651   predicted_pause_time_ms += _inc_cset_predicted_elapsed_time_ms;
  2653   ergo_verbose3(ErgoCSetConstruction | ErgoHigh,
  2654                 "add young regions to CSet",
  2655                 ergo_format_region("eden")
  2656                 ergo_format_region("survivors")
  2657                 ergo_format_ms("predicted young region time"),
  2658                 eden_region_length, survivor_region_length,
  2659                 _inc_cset_predicted_elapsed_time_ms);
  2661   // The number of recorded young regions is the incremental
  2662   // collection set's current size
  2663   set_recorded_rs_lengths(_inc_cset_recorded_rs_lengths);
  2665   double young_end_time_sec = os::elapsedTime();
  2666   _recorded_young_cset_choice_time_ms =
  2667     (young_end_time_sec - young_start_time_sec) * 1000.0;
  2669   // We are doing young collections so reset this.
  2670   non_young_start_time_sec = young_end_time_sec;
  2672   if (!full_young_gcs()) {
  2673     bool should_continue = true;
  2674     NumberSeq seq;
  2675     double avg_prediction = 100000000000000000.0; // something very large
  2677     double prev_predicted_pause_time_ms = predicted_pause_time_ms;
  2678     do {
  2679       // Note that add_old_region_to_cset() increments the
  2680       // _old_cset_region_length field and cset_region_length() returns the
  2681       // sum of _eden_cset_region_length, _survivor_cset_region_length, and
  2682       // _old_cset_region_length. So, as old regions are added to the
  2683       // CSet, _old_cset_region_length will be incremented and
  2684       // cset_region_length(), which is used below, will always reflect
  2685       // the the total number of regions added up to this point to the CSet.
  2687       hr = _collectionSetChooser->getNextMarkedRegion(time_remaining_ms,
  2688                                                       avg_prediction);
  2689       if (hr != NULL) {
  2690         _g1->old_set_remove(hr);
  2691         double predicted_time_ms = predict_region_elapsed_time_ms(hr, false);
  2692         time_remaining_ms -= predicted_time_ms;
  2693         predicted_pause_time_ms += predicted_time_ms;
  2694         add_old_region_to_cset(hr);
  2695         seq.add(predicted_time_ms);
  2696         avg_prediction = seq.avg() + seq.sd();
  2699       should_continue = true;
  2700       if (hr == NULL) {
  2701         // No need for an ergo verbose message here,
  2702         // getNextMarkRegion() does this when it returns NULL.
  2703         should_continue = false;
  2704       } else {
  2705         if (adaptive_young_list_length()) {
  2706           if (time_remaining_ms < 0.0) {
  2707             ergo_verbose1(ErgoCSetConstruction,
  2708                           "stop adding old regions to CSet",
  2709                           ergo_format_reason("remaining time is lower than 0")
  2710                           ergo_format_ms("remaining time"),
  2711                           time_remaining_ms);
  2712             should_continue = false;
  2714         } else {
  2715           if (cset_region_length() >= _young_list_fixed_length) {
  2716             ergo_verbose2(ErgoCSetConstruction,
  2717                           "stop adding old regions to CSet",
  2718                           ergo_format_reason("CSet length reached target")
  2719                           ergo_format_region("CSet")
  2720                           ergo_format_region("young target"),
  2721                           cset_region_length(), _young_list_fixed_length);
  2722             should_continue = false;
  2726     } while (should_continue);
  2728     if (!adaptive_young_list_length() &&
  2729                              cset_region_length() < _young_list_fixed_length) {
  2730       ergo_verbose2(ErgoCSetConstruction,
  2731                     "request partially-young GCs end",
  2732                     ergo_format_reason("CSet length lower than target")
  2733                     ergo_format_region("CSet")
  2734                     ergo_format_region("young target"),
  2735                     cset_region_length(), _young_list_fixed_length);
  2736       _should_revert_to_full_young_gcs  = true;
  2739     ergo_verbose2(ErgoCSetConstruction | ErgoHigh,
  2740                   "add old regions to CSet",
  2741                   ergo_format_region("old")
  2742                   ergo_format_ms("predicted old region time"),
  2743                   old_cset_region_length(),
  2744                   predicted_pause_time_ms - prev_predicted_pause_time_ms);
  2747   stop_incremental_cset_building();
  2749   count_CS_bytes_used();
  2751   ergo_verbose5(ErgoCSetConstruction,
  2752                 "finish choosing CSet",
  2753                 ergo_format_region("eden")
  2754                 ergo_format_region("survivors")
  2755                 ergo_format_region("old")
  2756                 ergo_format_ms("predicted pause time")
  2757                 ergo_format_ms("target pause time"),
  2758                 eden_region_length, survivor_region_length,
  2759                 old_cset_region_length(),
  2760                 predicted_pause_time_ms, target_pause_time_ms);
  2762   double non_young_end_time_sec = os::elapsedTime();
  2763   _recorded_non_young_cset_choice_time_ms =
  2764     (non_young_end_time_sec - non_young_start_time_sec) * 1000.0;

mercurial