1 /*
   2  * Copyright (c) 2004, 2005, 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  */
  24 
  25 # include "incls/_precompiled.incl"
  26 # include "incls/_gcAdaptivePolicyCounters.cpp.incl"
  27 
  28 // This class keeps statistical information and computes the
  29 // size of the heap.
  30 
  31 GCAdaptivePolicyCounters::GCAdaptivePolicyCounters(const char* name,
  32                                         int collectors,
  33                                         int generations,
  34                                         AdaptiveSizePolicy* size_policy_arg)
  35         : GCPolicyCounters(name, collectors, generations),
  36           _size_policy(size_policy_arg) {
  37   if (UsePerfData) {
  38     EXCEPTION_MARK;
  39     ResourceMark rm;
  40 
  41     const char* cname = PerfDataManager::counter_name(name_space(), "edenSize");
  42     _eden_size_counter = PerfDataManager::create_variable(SUN_GC, cname,
  43       PerfData::U_Bytes, _size_policy->calculated_eden_size_in_bytes(), CHECK);
  44 
  45     cname = PerfDataManager::counter_name(name_space(), "promoSize");
  46     _promo_size_counter = PerfDataManager::create_variable(SUN_GC, cname,
  47       PerfData::U_Bytes, size_policy()->calculated_promo_size_in_bytes(),
  48       CHECK);
  49 
  50     cname = PerfDataManager::counter_name(name_space(), "youngCapacity");
  51     size_t young_capacity_in_bytes =
  52       _size_policy->calculated_eden_size_in_bytes() +
  53       _size_policy->calculated_survivor_size_in_bytes();
  54     _young_capacity_counter = PerfDataManager::create_variable(SUN_GC, cname,
  55       PerfData::U_Bytes, young_capacity_in_bytes, CHECK);
  56 
  57     cname = PerfDataManager::counter_name(name_space(), "avgSurvivedAvg");
  58     _avg_survived_avg_counter = PerfDataManager::create_variable(SUN_GC, cname,
  59       PerfData::U_Bytes, size_policy()->calculated_survivor_size_in_bytes(),
  60         CHECK);
  61 
  62     cname = PerfDataManager::counter_name(name_space(), "avgSurvivedDev");
  63     _avg_survived_dev_counter = PerfDataManager::create_variable(SUN_GC, cname,
  64       PerfData::U_Bytes, (jlong) 0 , CHECK);
  65 
  66     cname = PerfDataManager::counter_name(name_space(), "avgSurvivedPaddedAvg");
  67     _avg_survived_padded_avg_counter =
  68       PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Bytes,
  69         size_policy()->calculated_survivor_size_in_bytes(), CHECK);
  70 
  71     cname = PerfDataManager::counter_name(name_space(), "avgMinorPauseTime");
  72     _avg_minor_pause_counter = PerfDataManager::create_variable(SUN_GC, cname,
  73       PerfData::U_Ticks, (jlong) _size_policy->_avg_minor_pause->average(),
  74       CHECK);
  75 
  76     cname = PerfDataManager::counter_name(name_space(), "avgMinorIntervalTime");
  77     _avg_minor_interval_counter = PerfDataManager::create_variable(SUN_GC,
  78       cname,
  79       PerfData::U_Ticks,
  80       (jlong) _size_policy->_avg_minor_interval->average(),
  81       CHECK);
  82 
  83 #ifdef NOT_PRODUCT
  84       // This is a counter for the most recent minor pause time
  85       // (the last sample, not the average).  It is useful for
  86       // verifying the average pause time but not worth putting
  87       // into the product.
  88       cname = PerfDataManager::counter_name(name_space(), "minorPauseTime");
  89       _minor_pause_counter = PerfDataManager::create_variable(SUN_GC, cname,
  90       PerfData::U_Ticks, (jlong) _size_policy->_avg_minor_pause->last_sample(),
  91       CHECK);
  92 #endif
  93 
  94     cname = PerfDataManager::counter_name(name_space(), "minorGcCost");
  95     _minor_gc_cost_counter = PerfDataManager::create_variable(SUN_GC,
  96       cname,
  97       PerfData::U_Ticks,
  98       (jlong) _size_policy->minor_gc_cost(),
  99       CHECK);
 100 
 101     cname = PerfDataManager::counter_name(name_space(), "mutatorCost");
 102     _mutator_cost_counter = PerfDataManager::create_variable(SUN_GC, cname,
 103       PerfData::U_Ticks, (jlong) _size_policy->mutator_cost(), CHECK);
 104 
 105     cname = PerfDataManager::counter_name(name_space(), "survived");
 106     _survived_counter = PerfDataManager::create_variable(SUN_GC, cname,
 107       PerfData::U_Bytes, (jlong) 0, CHECK);
 108 
 109     cname = PerfDataManager::counter_name(name_space(), "promoted");
 110     _promoted_counter = PerfDataManager::create_variable(SUN_GC, cname,
 111       PerfData::U_Bytes, (jlong) 0, CHECK);
 112 
 113     cname = PerfDataManager::counter_name(name_space(), "avgYoungLive");
 114     _avg_young_live_counter = PerfDataManager::create_variable(SUN_GC, cname,
 115       PerfData::U_Bytes, (jlong) size_policy()->avg_young_live()->average(),
 116       CHECK);
 117 
 118     cname = PerfDataManager::counter_name(name_space(), "avgOldLive");
 119     _avg_old_live_counter = PerfDataManager::create_variable(SUN_GC, cname,
 120       PerfData::U_Bytes, (jlong) size_policy()->avg_old_live()->average(),
 121       CHECK);
 122 
 123     cname = PerfDataManager::counter_name(name_space(), "survivorOverflowed");
 124     _survivor_overflowed_counter = PerfDataManager::create_variable(SUN_GC, cname,
 125       PerfData::U_Events, (jlong)0, CHECK);
 126 
 127     cname = PerfDataManager::counter_name(name_space(),
 128       "decrementTenuringThresholdForGcCost");
 129     _decrement_tenuring_threshold_for_gc_cost_counter =
 130       PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
 131         (jlong)0, CHECK);
 132 
 133     cname = PerfDataManager::counter_name(name_space(),
 134       "incrementTenuringThresholdForGcCost");
 135     _increment_tenuring_threshold_for_gc_cost_counter =
 136       PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
 137         (jlong)0, CHECK);
 138 
 139     cname = PerfDataManager::counter_name(name_space(),
 140       "decrementTenuringThresholdForSurvivorLimit");
 141     _decrement_tenuring_threshold_for_survivor_limit_counter =
 142       PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
 143         (jlong)0, CHECK);
 144     cname = PerfDataManager::counter_name(name_space(),
 145       "changeYoungGenForMinPauses");
 146     _change_young_gen_for_min_pauses_counter =
 147       PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
 148         (jlong)0, CHECK);
 149 
 150     cname = PerfDataManager::counter_name(name_space(),
 151       "changeOldGenForMajPauses");
 152     _change_old_gen_for_maj_pauses_counter =
 153       PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
 154         (jlong)0, CHECK);
 155 
 156     cname = PerfDataManager::counter_name(name_space(),
 157       "increaseOldGenForThroughput");
 158     _change_old_gen_for_throughput_counter =
 159       PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
 160         (jlong)0, CHECK);
 161 
 162     cname = PerfDataManager::counter_name(name_space(),
 163       "increaseYoungGenForThroughput");
 164     _change_young_gen_for_throughput_counter =
 165       PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
 166         (jlong)0, CHECK);
 167 
 168     cname = PerfDataManager::counter_name(name_space(),
 169       "decreaseForFootprint");
 170     _decrease_for_footprint_counter =
 171       PerfDataManager::create_variable(SUN_GC, cname,
 172       PerfData::U_Events, (jlong)0, CHECK);
 173 
 174     cname = PerfDataManager::counter_name(name_space(), "decideAtFullGc");
 175     _decide_at_full_gc_counter = PerfDataManager::create_variable(SUN_GC, cname,
 176       PerfData::U_None, (jlong)0, CHECK);
 177 
 178     cname = PerfDataManager::counter_name(name_space(), "minorPauseYoungSlope");
 179     _minor_pause_young_slope_counter =
 180       PerfDataManager::create_variable(SUN_GC, cname,
 181       PerfData::U_None, (jlong) 0, CHECK);
 182 
 183     cname = PerfDataManager::counter_name(name_space(), "majorCollectionSlope");
 184     _major_collection_slope_counter =
 185       PerfDataManager::create_variable(SUN_GC, cname,
 186       PerfData::U_None, (jlong) 0, CHECK);
 187 
 188     cname = PerfDataManager::counter_name(name_space(), "minorCollectionSlope");
 189     _minor_collection_slope_counter =
 190       PerfDataManager::create_variable(SUN_GC, cname,
 191       PerfData::U_None, (jlong) 0, CHECK);
 192   }
 193 }
 194 
 195 void GCAdaptivePolicyCounters::update_counters_from_policy() {
 196   if (UsePerfData && (size_policy() != NULL)) {
 197     update_avg_minor_pause_counter();
 198     update_avg_minor_interval_counter();
 199 #ifdef NOT_PRODUCT
 200     update_minor_pause_counter();
 201 #endif
 202     update_minor_gc_cost_counter();
 203     update_avg_young_live_counter();
 204 
 205     update_survivor_size_counters();
 206     update_avg_survived_avg_counters();
 207     update_avg_survived_dev_counters();
 208     update_avg_survived_padded_avg_counters();
 209 
 210     update_change_old_gen_for_throughput();
 211     update_change_young_gen_for_throughput();
 212     update_decrease_for_footprint();
 213     update_change_young_gen_for_min_pauses();
 214     update_change_old_gen_for_maj_pauses();
 215 
 216     update_minor_pause_young_slope_counter();
 217     update_minor_collection_slope_counter();
 218     update_major_collection_slope_counter();
 219   }
 220 }
 221 
 222 void GCAdaptivePolicyCounters::update_counters() {
 223   if (UsePerfData) {
 224     update_counters_from_policy();
 225   }
 226 }