src/share/vm/gc_implementation/shared/gcAdaptivePolicyCounters.cpp

Thu, 20 Sep 2012 09:52:56 -0700

author
johnc
date
Thu, 20 Sep 2012 09:52:56 -0700
changeset 4067
b2ef234911c9
parent 2314
f95d63e2154a
child 6876
710a3c8b516e
permissions
-rw-r--r--

7190666: G1: assert(_unused == 0) failed: Inconsistency in PLAB stats
Summary: Reset the fields in ParGCAllocBuffer, that are used for accumulating values for the ResizePLAB sensors in PLABStats, to zero after flushing the values to the PLABStats fields. Flush PLABStats values only when retiring the final allocation buffers prior to disposing of a G1ParScanThreadState object, rather than when retiring every allocation buffer.
Reviewed-by: jwilhelm, jmasa, ysr

duke@435 1 /*
stefank@2314 2 * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
duke@435 22 *
duke@435 23 */
duke@435 24
stefank@2314 25 #include "precompiled.hpp"
stefank@2314 26 #include "gc_implementation/shared/gcAdaptivePolicyCounters.hpp"
stefank@2314 27 #include "memory/resourceArea.hpp"
duke@435 28
duke@435 29 // This class keeps statistical information and computes the
duke@435 30 // size of the heap.
duke@435 31
duke@435 32 GCAdaptivePolicyCounters::GCAdaptivePolicyCounters(const char* name,
duke@435 33 int collectors,
duke@435 34 int generations,
duke@435 35 AdaptiveSizePolicy* size_policy_arg)
duke@435 36 : GCPolicyCounters(name, collectors, generations),
duke@435 37 _size_policy(size_policy_arg) {
duke@435 38 if (UsePerfData) {
duke@435 39 EXCEPTION_MARK;
duke@435 40 ResourceMark rm;
duke@435 41
duke@435 42 const char* cname = PerfDataManager::counter_name(name_space(), "edenSize");
duke@435 43 _eden_size_counter = PerfDataManager::create_variable(SUN_GC, cname,
duke@435 44 PerfData::U_Bytes, _size_policy->calculated_eden_size_in_bytes(), CHECK);
duke@435 45
duke@435 46 cname = PerfDataManager::counter_name(name_space(), "promoSize");
duke@435 47 _promo_size_counter = PerfDataManager::create_variable(SUN_GC, cname,
duke@435 48 PerfData::U_Bytes, size_policy()->calculated_promo_size_in_bytes(),
duke@435 49 CHECK);
duke@435 50
duke@435 51 cname = PerfDataManager::counter_name(name_space(), "youngCapacity");
duke@435 52 size_t young_capacity_in_bytes =
duke@435 53 _size_policy->calculated_eden_size_in_bytes() +
duke@435 54 _size_policy->calculated_survivor_size_in_bytes();
duke@435 55 _young_capacity_counter = PerfDataManager::create_variable(SUN_GC, cname,
duke@435 56 PerfData::U_Bytes, young_capacity_in_bytes, CHECK);
duke@435 57
duke@435 58 cname = PerfDataManager::counter_name(name_space(), "avgSurvivedAvg");
duke@435 59 _avg_survived_avg_counter = PerfDataManager::create_variable(SUN_GC, cname,
duke@435 60 PerfData::U_Bytes, size_policy()->calculated_survivor_size_in_bytes(),
duke@435 61 CHECK);
duke@435 62
duke@435 63 cname = PerfDataManager::counter_name(name_space(), "avgSurvivedDev");
duke@435 64 _avg_survived_dev_counter = PerfDataManager::create_variable(SUN_GC, cname,
duke@435 65 PerfData::U_Bytes, (jlong) 0 , CHECK);
duke@435 66
duke@435 67 cname = PerfDataManager::counter_name(name_space(), "avgSurvivedPaddedAvg");
duke@435 68 _avg_survived_padded_avg_counter =
duke@435 69 PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Bytes,
duke@435 70 size_policy()->calculated_survivor_size_in_bytes(), CHECK);
duke@435 71
duke@435 72 cname = PerfDataManager::counter_name(name_space(), "avgMinorPauseTime");
duke@435 73 _avg_minor_pause_counter = PerfDataManager::create_variable(SUN_GC, cname,
duke@435 74 PerfData::U_Ticks, (jlong) _size_policy->_avg_minor_pause->average(),
duke@435 75 CHECK);
duke@435 76
duke@435 77 cname = PerfDataManager::counter_name(name_space(), "avgMinorIntervalTime");
duke@435 78 _avg_minor_interval_counter = PerfDataManager::create_variable(SUN_GC,
duke@435 79 cname,
duke@435 80 PerfData::U_Ticks,
duke@435 81 (jlong) _size_policy->_avg_minor_interval->average(),
duke@435 82 CHECK);
duke@435 83
duke@435 84 #ifdef NOT_PRODUCT
duke@435 85 // This is a counter for the most recent minor pause time
duke@435 86 // (the last sample, not the average). It is useful for
duke@435 87 // verifying the average pause time but not worth putting
duke@435 88 // into the product.
duke@435 89 cname = PerfDataManager::counter_name(name_space(), "minorPauseTime");
duke@435 90 _minor_pause_counter = PerfDataManager::create_variable(SUN_GC, cname,
duke@435 91 PerfData::U_Ticks, (jlong) _size_policy->_avg_minor_pause->last_sample(),
duke@435 92 CHECK);
duke@435 93 #endif
duke@435 94
duke@435 95 cname = PerfDataManager::counter_name(name_space(), "minorGcCost");
duke@435 96 _minor_gc_cost_counter = PerfDataManager::create_variable(SUN_GC,
duke@435 97 cname,
duke@435 98 PerfData::U_Ticks,
duke@435 99 (jlong) _size_policy->minor_gc_cost(),
duke@435 100 CHECK);
duke@435 101
duke@435 102 cname = PerfDataManager::counter_name(name_space(), "mutatorCost");
duke@435 103 _mutator_cost_counter = PerfDataManager::create_variable(SUN_GC, cname,
duke@435 104 PerfData::U_Ticks, (jlong) _size_policy->mutator_cost(), CHECK);
duke@435 105
duke@435 106 cname = PerfDataManager::counter_name(name_space(), "survived");
duke@435 107 _survived_counter = PerfDataManager::create_variable(SUN_GC, cname,
duke@435 108 PerfData::U_Bytes, (jlong) 0, CHECK);
duke@435 109
duke@435 110 cname = PerfDataManager::counter_name(name_space(), "promoted");
duke@435 111 _promoted_counter = PerfDataManager::create_variable(SUN_GC, cname,
duke@435 112 PerfData::U_Bytes, (jlong) 0, CHECK);
duke@435 113
duke@435 114 cname = PerfDataManager::counter_name(name_space(), "avgYoungLive");
duke@435 115 _avg_young_live_counter = PerfDataManager::create_variable(SUN_GC, cname,
duke@435 116 PerfData::U_Bytes, (jlong) size_policy()->avg_young_live()->average(),
duke@435 117 CHECK);
duke@435 118
duke@435 119 cname = PerfDataManager::counter_name(name_space(), "avgOldLive");
duke@435 120 _avg_old_live_counter = PerfDataManager::create_variable(SUN_GC, cname,
duke@435 121 PerfData::U_Bytes, (jlong) size_policy()->avg_old_live()->average(),
duke@435 122 CHECK);
duke@435 123
duke@435 124 cname = PerfDataManager::counter_name(name_space(), "survivorOverflowed");
duke@435 125 _survivor_overflowed_counter = PerfDataManager::create_variable(SUN_GC, cname,
duke@435 126 PerfData::U_Events, (jlong)0, CHECK);
duke@435 127
duke@435 128 cname = PerfDataManager::counter_name(name_space(),
duke@435 129 "decrementTenuringThresholdForGcCost");
duke@435 130 _decrement_tenuring_threshold_for_gc_cost_counter =
duke@435 131 PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
duke@435 132 (jlong)0, CHECK);
duke@435 133
duke@435 134 cname = PerfDataManager::counter_name(name_space(),
duke@435 135 "incrementTenuringThresholdForGcCost");
duke@435 136 _increment_tenuring_threshold_for_gc_cost_counter =
duke@435 137 PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
duke@435 138 (jlong)0, CHECK);
duke@435 139
duke@435 140 cname = PerfDataManager::counter_name(name_space(),
duke@435 141 "decrementTenuringThresholdForSurvivorLimit");
duke@435 142 _decrement_tenuring_threshold_for_survivor_limit_counter =
duke@435 143 PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
duke@435 144 (jlong)0, CHECK);
duke@435 145 cname = PerfDataManager::counter_name(name_space(),
duke@435 146 "changeYoungGenForMinPauses");
duke@435 147 _change_young_gen_for_min_pauses_counter =
duke@435 148 PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
duke@435 149 (jlong)0, CHECK);
duke@435 150
duke@435 151 cname = PerfDataManager::counter_name(name_space(),
duke@435 152 "changeOldGenForMajPauses");
duke@435 153 _change_old_gen_for_maj_pauses_counter =
duke@435 154 PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
duke@435 155 (jlong)0, CHECK);
duke@435 156
duke@435 157 cname = PerfDataManager::counter_name(name_space(),
duke@435 158 "increaseOldGenForThroughput");
duke@435 159 _change_old_gen_for_throughput_counter =
duke@435 160 PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
duke@435 161 (jlong)0, CHECK);
duke@435 162
duke@435 163 cname = PerfDataManager::counter_name(name_space(),
duke@435 164 "increaseYoungGenForThroughput");
duke@435 165 _change_young_gen_for_throughput_counter =
duke@435 166 PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
duke@435 167 (jlong)0, CHECK);
duke@435 168
duke@435 169 cname = PerfDataManager::counter_name(name_space(),
duke@435 170 "decreaseForFootprint");
duke@435 171 _decrease_for_footprint_counter =
duke@435 172 PerfDataManager::create_variable(SUN_GC, cname,
duke@435 173 PerfData::U_Events, (jlong)0, CHECK);
duke@435 174
duke@435 175 cname = PerfDataManager::counter_name(name_space(), "decideAtFullGc");
duke@435 176 _decide_at_full_gc_counter = PerfDataManager::create_variable(SUN_GC, cname,
duke@435 177 PerfData::U_None, (jlong)0, CHECK);
duke@435 178
duke@435 179 cname = PerfDataManager::counter_name(name_space(), "minorPauseYoungSlope");
duke@435 180 _minor_pause_young_slope_counter =
duke@435 181 PerfDataManager::create_variable(SUN_GC, cname,
duke@435 182 PerfData::U_None, (jlong) 0, CHECK);
duke@435 183
duke@435 184 cname = PerfDataManager::counter_name(name_space(), "majorCollectionSlope");
duke@435 185 _major_collection_slope_counter =
duke@435 186 PerfDataManager::create_variable(SUN_GC, cname,
duke@435 187 PerfData::U_None, (jlong) 0, CHECK);
duke@435 188
duke@435 189 cname = PerfDataManager::counter_name(name_space(), "minorCollectionSlope");
duke@435 190 _minor_collection_slope_counter =
duke@435 191 PerfDataManager::create_variable(SUN_GC, cname,
duke@435 192 PerfData::U_None, (jlong) 0, CHECK);
duke@435 193 }
duke@435 194 }
duke@435 195
duke@435 196 void GCAdaptivePolicyCounters::update_counters_from_policy() {
duke@435 197 if (UsePerfData && (size_policy() != NULL)) {
duke@435 198 update_avg_minor_pause_counter();
duke@435 199 update_avg_minor_interval_counter();
duke@435 200 #ifdef NOT_PRODUCT
duke@435 201 update_minor_pause_counter();
duke@435 202 #endif
duke@435 203 update_minor_gc_cost_counter();
duke@435 204 update_avg_young_live_counter();
duke@435 205
duke@435 206 update_survivor_size_counters();
duke@435 207 update_avg_survived_avg_counters();
duke@435 208 update_avg_survived_dev_counters();
duke@435 209 update_avg_survived_padded_avg_counters();
duke@435 210
duke@435 211 update_change_old_gen_for_throughput();
duke@435 212 update_change_young_gen_for_throughput();
duke@435 213 update_decrease_for_footprint();
duke@435 214 update_change_young_gen_for_min_pauses();
duke@435 215 update_change_old_gen_for_maj_pauses();
duke@435 216
duke@435 217 update_minor_pause_young_slope_counter();
duke@435 218 update_minor_collection_slope_counter();
duke@435 219 update_major_collection_slope_counter();
duke@435 220 }
duke@435 221 }
duke@435 222
duke@435 223 void GCAdaptivePolicyCounters::update_counters() {
duke@435 224 if (UsePerfData) {
duke@435 225 update_counters_from_policy();
duke@435 226 }
duke@435 227 }

mercurial