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