hotspot/src/share/vm/gc_implementation/g1/survRateGroup.cpp
changeset 12117 23b52cd6ca73
parent 7397 5b173b4ca846
child 13195 be27e1b6a4b9
equal deleted inserted replaced
12116:d81396ae8bf6 12117:23b52cd6ca73
     1 /*
     1 /*
     2  * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     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
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
    36     _summary_surv_rates_len(summary_surv_rates_len),
    36     _summary_surv_rates_len(summary_surv_rates_len),
    37     _summary_surv_rates_max_len(0),
    37     _summary_surv_rates_max_len(0),
    38     _summary_surv_rates(NULL),
    38     _summary_surv_rates(NULL),
    39     _surv_rate(NULL),
    39     _surv_rate(NULL),
    40     _accum_surv_rate_pred(NULL),
    40     _accum_surv_rate_pred(NULL),
    41     _surv_rate_pred(NULL)
    41     _surv_rate_pred(NULL),
    42 {
    42     _stats_arrays_length(0) {
    43   reset();
    43   reset();
    44   if (summary_surv_rates_len > 0) {
    44   if (summary_surv_rates_len > 0) {
    45     size_t length = summary_surv_rates_len;
    45     size_t length = summary_surv_rates_len;
    46       _summary_surv_rates = NEW_C_HEAP_ARRAY(NumberSeq*, length);
    46     _summary_surv_rates = NEW_C_HEAP_ARRAY(NumberSeq*, length);
    47     if (_summary_surv_rates == NULL) {
    47     for (size_t i = 0; i < length; ++i) {
    48       vm_exit_out_of_memory(sizeof(NumberSeq*) * length,
       
    49                             "Not enough space for surv rate summary");
       
    50     }
       
    51     for (size_t i = 0; i < length; ++i)
       
    52       _summary_surv_rates[i] = new NumberSeq();
    48       _summary_surv_rates[i] = new NumberSeq();
       
    49     }
    53   }
    50   }
    54 
    51 
    55   start_adding_regions();
    52   start_adding_regions();
    56 }
    53 }
    57 
    54 
    58 
    55 void SurvRateGroup::reset() {
    59 void SurvRateGroup::reset()
       
    60 {
       
    61   _all_regions_allocated = 0;
    56   _all_regions_allocated = 0;
    62   _setup_seq_num         = 0;
    57   _setup_seq_num         = 0;
    63   _stats_arrays_length   = 0;
       
    64   _accum_surv_rate       = 0.0;
    58   _accum_surv_rate       = 0.0;
    65   _last_pred             = 0.0;
    59   _last_pred             = 0.0;
    66   // the following will set up the arrays with length 1
    60   // the following will set up the arrays with length 1
    67   _region_num            = 1;
    61   _region_num            = 1;
       
    62 
       
    63   // The call to stop_adding_regions() will use "new" to refill
       
    64   // the _surv_rate_pred array, so we need to make sure to call
       
    65   // "delete".
       
    66   for (size_t i = 0; i < _stats_arrays_length; ++i) {
       
    67     delete _surv_rate_pred[i];
       
    68   }
       
    69   _stats_arrays_length = 0;
       
    70 
    68   stop_adding_regions();
    71   stop_adding_regions();
    69   guarantee( _stats_arrays_length == 1, "invariant" );
    72   guarantee( _stats_arrays_length == 1, "invariant" );
    70   guarantee( _surv_rate_pred[0] != NULL, "invariant" );
    73   guarantee( _surv_rate_pred[0] != NULL, "invariant" );
    71   _surv_rate_pred[0]->add(0.4);
    74   _surv_rate_pred[0]->add(0.4);
    72   all_surviving_words_recorded(false);
    75   all_surviving_words_recorded(false);
    73   _region_num = 0;
    76   _region_num = 0;
    74 }
    77 }
    75 
    78 
    76 
       
    77 void
    79 void
    78 SurvRateGroup::start_adding_regions() {
    80 SurvRateGroup::start_adding_regions() {
    79   _setup_seq_num   = _stats_arrays_length;
    81   _setup_seq_num   = _stats_arrays_length;
    80   _region_num      = 0;
    82   _region_num      = 0;
    81   _accum_surv_rate = 0.0;
    83   _accum_surv_rate = 0.0;
    82 
       
    83 #if 0
       
    84   gclog_or_tty->print_cr("[%s] start adding regions, seq num %d, length %d",
       
    85                          _name, _setup_seq_num, _region_num);
       
    86 #endif // 0
       
    87 }
    84 }
    88 
    85 
    89 void
    86 void
    90 SurvRateGroup::stop_adding_regions() {
    87 SurvRateGroup::stop_adding_regions() {
    91 
       
    92 #if 0
       
    93   gclog_or_tty->print_cr("[%s] stop adding regions, length %d", _name, _region_num);
       
    94 #endif // 0
       
    95 
       
    96   if (_region_num > _stats_arrays_length) {
    88   if (_region_num > _stats_arrays_length) {
    97     double* old_surv_rate = _surv_rate;
    89     double* old_surv_rate = _surv_rate;
    98     double* old_accum_surv_rate_pred = _accum_surv_rate_pred;
    90     double* old_accum_surv_rate_pred = _accum_surv_rate_pred;
    99     TruncatedSeq** old_surv_rate_pred = _surv_rate_pred;
    91     TruncatedSeq** old_surv_rate_pred = _surv_rate_pred;
   100 
    92 
   101     _surv_rate = NEW_C_HEAP_ARRAY(double, _region_num);
    93     _surv_rate = NEW_C_HEAP_ARRAY(double, _region_num);
   102     if (_surv_rate == NULL) {
       
   103       vm_exit_out_of_memory(sizeof(double) * _region_num,
       
   104                             "Not enough space for surv rate array.");
       
   105     }
       
   106     _accum_surv_rate_pred = NEW_C_HEAP_ARRAY(double, _region_num);
    94     _accum_surv_rate_pred = NEW_C_HEAP_ARRAY(double, _region_num);
   107     if (_accum_surv_rate_pred == NULL) {
       
   108       vm_exit_out_of_memory(sizeof(double) * _region_num,
       
   109                          "Not enough space for accum surv rate pred array.");
       
   110     }
       
   111     _surv_rate_pred = NEW_C_HEAP_ARRAY(TruncatedSeq*, _region_num);
    95     _surv_rate_pred = NEW_C_HEAP_ARRAY(TruncatedSeq*, _region_num);
   112     if (_surv_rate == NULL) {
    96 
   113       vm_exit_out_of_memory(sizeof(TruncatedSeq*) * _region_num,
    97     for (size_t i = 0; i < _stats_arrays_length; ++i) {
   114                             "Not enough space for surv rate pred array.");
       
   115     }
       
   116 
       
   117     for (size_t i = 0; i < _stats_arrays_length; ++i)
       
   118       _surv_rate_pred[i] = old_surv_rate_pred[i];
    98       _surv_rate_pred[i] = old_surv_rate_pred[i];
   119 
    99     }
   120 #if 0
       
   121     gclog_or_tty->print_cr("[%s] stop adding regions, new seqs %d to %d",
       
   122                   _name, _array_length, _region_num - 1);
       
   123 #endif // 0
       
   124 
       
   125     for (size_t i = _stats_arrays_length; i < _region_num; ++i) {
   100     for (size_t i = _stats_arrays_length; i < _region_num; ++i) {
   126       _surv_rate_pred[i] = new TruncatedSeq(10);
   101       _surv_rate_pred[i] = new TruncatedSeq(10);
   127       // _surv_rate_pred[i]->add(last_pred);
       
   128     }
   102     }
   129 
   103 
   130     _stats_arrays_length = _region_num;
   104     _stats_arrays_length = _region_num;
   131 
   105 
   132     if (old_surv_rate != NULL)
   106     if (old_surv_rate != NULL) {
   133       FREE_C_HEAP_ARRAY(double, old_surv_rate);
   107       FREE_C_HEAP_ARRAY(double, old_surv_rate);
   134     if (old_accum_surv_rate_pred != NULL)
   108     }
       
   109     if (old_accum_surv_rate_pred != NULL) {
   135       FREE_C_HEAP_ARRAY(double, old_accum_surv_rate_pred);
   110       FREE_C_HEAP_ARRAY(double, old_accum_surv_rate_pred);
   136     if (old_surv_rate_pred != NULL)
   111     }
   137       FREE_C_HEAP_ARRAY(NumberSeq*, old_surv_rate_pred);
   112     if (old_surv_rate_pred != NULL) {
   138   }
   113       FREE_C_HEAP_ARRAY(TruncatedSeq*, old_surv_rate_pred);
   139 
   114     }
   140   for (size_t i = 0; i < _stats_arrays_length; ++i)
   115   }
       
   116 
       
   117   for (size_t i = 0; i < _stats_arrays_length; ++i) {
   141     _surv_rate[i] = 0.0;
   118     _surv_rate[i] = 0.0;
       
   119   }
   142 }
   120 }
   143 
   121 
   144 double
   122 double
   145 SurvRateGroup::accum_surv_rate(size_t adjustment) {
   123 SurvRateGroup::accum_surv_rate(size_t adjustment) {
   146   // we might relax this one in the future...
   124   // we might relax this one in the future...
   185 
   163 
   186 void
   164 void
   187 SurvRateGroup::all_surviving_words_recorded(bool propagate) {
   165 SurvRateGroup::all_surviving_words_recorded(bool propagate) {
   188   if (propagate && _region_num > 0) { // conservative
   166   if (propagate && _region_num > 0) { // conservative
   189     double surv_rate = _surv_rate_pred[_region_num-1]->last();
   167     double surv_rate = _surv_rate_pred[_region_num-1]->last();
   190 
       
   191 #if 0
       
   192     gclog_or_tty->print_cr("propagating %1.2lf from %d to %d",
       
   193                   surv_rate, _curr_length, _array_length - 1);
       
   194 #endif // 0
       
   195 
       
   196     for (size_t i = _region_num; i < _stats_arrays_length; ++i) {
   168     for (size_t i = _region_num; i < _stats_arrays_length; ++i) {
   197       guarantee( _surv_rate[i] <= 0.00001,
   169       guarantee( _surv_rate[i] <= 0.00001,
   198                  "the slot should not have been updated" );
   170                  "the slot should not have been updated" );
   199       _surv_rate_pred[i]->add(surv_rate);
   171       _surv_rate_pred[i]->add(surv_rate);
   200     }
   172     }