src/share/vm/gc_implementation/concurrentMarkSweep/cmsGCAdaptivePolicyCounters.cpp

Wed, 23 Dec 2009 09:23:54 -0800

author
ysr
date
Wed, 23 Dec 2009 09:23:54 -0800
changeset 1580
e018e6884bd8
parent 435
a61af66fc99e
child 1907
c18cbe5936b8
permissions
-rw-r--r--

6631166: CMS: better heuristics when combatting fragmentation
Summary: Autonomic per-worker free block cache sizing, tunable coalition policies, fixes to per-size block statistics, retuned gain and bandwidth of some feedback loop filters to allow quicker reactivity to abrupt changes in ambient demand, and other heuristics to reduce fragmentation of the CMS old gen. Also tightened some assertions, including those related to locking.
Reviewed-by: jmasa

duke@435 1 /*
duke@435 2 * Copyright 2004-2005 Sun Microsystems, Inc. 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 *
duke@435 19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
duke@435 20 * CA 95054 USA or visit www.sun.com if you need additional information or
duke@435 21 * have any questions.
duke@435 22 *
duke@435 23 */
duke@435 24
duke@435 25 # include "incls/_precompiled.incl"
duke@435 26 # include "incls/_cmsGCAdaptivePolicyCounters.cpp.incl"
duke@435 27
duke@435 28 CMSGCAdaptivePolicyCounters::CMSGCAdaptivePolicyCounters(const char* name_arg,
duke@435 29 int collectors,
duke@435 30 int generations,
duke@435 31 AdaptiveSizePolicy* size_policy_arg)
duke@435 32 : GCAdaptivePolicyCounters(name_arg,
duke@435 33 collectors,
duke@435 34 generations,
duke@435 35 size_policy_arg) {
duke@435 36 if (UsePerfData) {
duke@435 37 EXCEPTION_MARK;
duke@435 38 ResourceMark rm;
duke@435 39
duke@435 40 const char* cname =
duke@435 41 PerfDataManager::counter_name(name_space(), "cmsCapacity");
duke@435 42 _cms_capacity_counter = PerfDataManager::create_variable(SUN_GC, cname,
duke@435 43 PerfData::U_Bytes, (jlong) OldSize, CHECK);
duke@435 44 #ifdef NOT_PRODUCT
duke@435 45 cname =
duke@435 46 PerfDataManager::counter_name(name_space(), "initialPause");
duke@435 47 _initial_pause_counter = PerfDataManager::create_variable(SUN_GC, cname,
duke@435 48 PerfData::U_Ticks,
duke@435 49 (jlong) cms_size_policy()->avg_initial_pause()->last_sample(),
duke@435 50 CHECK);
duke@435 51
duke@435 52 cname = PerfDataManager::counter_name(name_space(), "remarkPause");
duke@435 53 _remark_pause_counter = PerfDataManager::create_variable(SUN_GC, cname,
duke@435 54 PerfData::U_Ticks,
duke@435 55 (jlong) cms_size_policy()->avg_remark_pause()->last_sample(),
duke@435 56 CHECK);
duke@435 57 #endif
duke@435 58 cname =
duke@435 59 PerfDataManager::counter_name(name_space(), "avgInitialPause");
duke@435 60 _avg_initial_pause_counter = PerfDataManager::create_variable(SUN_GC, cname,
duke@435 61 PerfData::U_Ticks,
duke@435 62 (jlong) cms_size_policy()->avg_initial_pause()->average(),
duke@435 63 CHECK);
duke@435 64
duke@435 65 cname = PerfDataManager::counter_name(name_space(), "avgRemarkPause");
duke@435 66 _avg_remark_pause_counter = PerfDataManager::create_variable(SUN_GC, cname,
duke@435 67 PerfData::U_Ticks,
duke@435 68 (jlong) cms_size_policy()->avg_remark_pause()->average(),
duke@435 69 CHECK);
duke@435 70
duke@435 71 cname = PerfDataManager::counter_name(name_space(), "avgSTWGcCost");
duke@435 72 _avg_cms_STW_gc_cost_counter = PerfDataManager::create_variable(SUN_GC,
duke@435 73 cname,
duke@435 74 PerfData::U_Ticks,
duke@435 75 (jlong) cms_size_policy()->avg_cms_STW_gc_cost()->average(),
duke@435 76 CHECK);
duke@435 77
duke@435 78 cname = PerfDataManager::counter_name(name_space(), "avgSTWTime");
duke@435 79 _avg_cms_STW_time_counter = PerfDataManager::create_variable(SUN_GC,
duke@435 80 cname,
duke@435 81 PerfData::U_Ticks,
duke@435 82 (jlong) cms_size_policy()->avg_cms_STW_time()->average(),
duke@435 83 CHECK);
duke@435 84
duke@435 85
duke@435 86 cname = PerfDataManager::counter_name(name_space(), "avgConcurrentTime");
duke@435 87 _avg_concurrent_time_counter = PerfDataManager::create_variable(SUN_GC,
duke@435 88 cname,
duke@435 89 PerfData::U_Ticks,
duke@435 90 (jlong) cms_size_policy()->avg_concurrent_time()->average(),
duke@435 91 CHECK);
duke@435 92
duke@435 93 cname =
duke@435 94 PerfDataManager::counter_name(name_space(), "avgConcurrentInterval");
duke@435 95 _avg_concurrent_interval_counter = PerfDataManager::create_variable(SUN_GC,
duke@435 96 cname,
duke@435 97 PerfData::U_Ticks,
duke@435 98 (jlong) cms_size_policy()->avg_concurrent_interval()->average(),
duke@435 99 CHECK);
duke@435 100
duke@435 101 cname = PerfDataManager::counter_name(name_space(), "avgConcurrentGcCost");
duke@435 102 _avg_concurrent_gc_cost_counter = PerfDataManager::create_variable(SUN_GC,
duke@435 103 cname,
duke@435 104 PerfData::U_Ticks,
duke@435 105 (jlong) cms_size_policy()->avg_concurrent_gc_cost()->average(),
duke@435 106 CHECK);
duke@435 107
duke@435 108 cname = PerfDataManager::counter_name(name_space(), "avgCMSFreeAtSweep");
duke@435 109 _avg_cms_free_at_sweep_counter = PerfDataManager::create_variable(SUN_GC,
duke@435 110 cname,
duke@435 111 PerfData::U_Ticks,
duke@435 112 (jlong) cms_size_policy()->avg_cms_free_at_sweep()->average(),
duke@435 113 CHECK);
duke@435 114
duke@435 115 cname = PerfDataManager::counter_name(name_space(), "avgCMSFree");
duke@435 116 _avg_cms_free_counter = PerfDataManager::create_variable(SUN_GC,
duke@435 117 cname,
duke@435 118 PerfData::U_Ticks,
duke@435 119 (jlong) cms_size_policy()->avg_cms_free()->average(),
duke@435 120 CHECK);
duke@435 121
duke@435 122 cname = PerfDataManager::counter_name(name_space(), "avgCMSPromo");
duke@435 123 _avg_cms_promo_counter = PerfDataManager::create_variable(SUN_GC,
duke@435 124 cname,
duke@435 125 PerfData::U_Ticks,
duke@435 126 (jlong) cms_size_policy()->avg_cms_promo()->average(),
duke@435 127 CHECK);
duke@435 128
duke@435 129 cname = PerfDataManager::counter_name(name_space(), "avgMscPause");
duke@435 130 _avg_msc_pause_counter = PerfDataManager::create_variable(SUN_GC,
duke@435 131 cname,
duke@435 132 PerfData::U_Ticks,
duke@435 133 (jlong) cms_size_policy()->avg_msc_pause()->average(),
duke@435 134 CHECK);
duke@435 135
duke@435 136 cname = PerfDataManager::counter_name(name_space(), "avgMscInterval");
duke@435 137 _avg_msc_interval_counter = PerfDataManager::create_variable(SUN_GC,
duke@435 138 cname,
duke@435 139 PerfData::U_Ticks,
duke@435 140 (jlong) cms_size_policy()->avg_msc_interval()->average(),
duke@435 141 CHECK);
duke@435 142
duke@435 143 cname = PerfDataManager::counter_name(name_space(), "mscGcCost");
duke@435 144 _msc_gc_cost_counter = PerfDataManager::create_variable(SUN_GC,
duke@435 145 cname,
duke@435 146 PerfData::U_Ticks,
duke@435 147 (jlong) cms_size_policy()->avg_msc_gc_cost()->average(),
duke@435 148 CHECK);
duke@435 149
duke@435 150 cname = PerfDataManager::counter_name(name_space(), "avgMsPause");
duke@435 151 _avg_ms_pause_counter = PerfDataManager::create_variable(SUN_GC,
duke@435 152 cname,
duke@435 153 PerfData::U_Ticks,
duke@435 154 (jlong) cms_size_policy()->avg_ms_pause()->average(),
duke@435 155 CHECK);
duke@435 156
duke@435 157 cname = PerfDataManager::counter_name(name_space(), "avgMsInterval");
duke@435 158 _avg_ms_interval_counter = PerfDataManager::create_variable(SUN_GC,
duke@435 159 cname,
duke@435 160 PerfData::U_Ticks,
duke@435 161 (jlong) cms_size_policy()->avg_ms_interval()->average(),
duke@435 162 CHECK);
duke@435 163
duke@435 164 cname = PerfDataManager::counter_name(name_space(), "msGcCost");
duke@435 165 _ms_gc_cost_counter = PerfDataManager::create_variable(SUN_GC,
duke@435 166 cname,
duke@435 167 PerfData::U_Ticks,
duke@435 168 (jlong) cms_size_policy()->avg_ms_gc_cost()->average(),
duke@435 169 CHECK);
duke@435 170
duke@435 171 cname = PerfDataManager::counter_name(name_space(), "majorGcCost");
duke@435 172 _major_gc_cost_counter = PerfDataManager::create_variable(SUN_GC, cname,
duke@435 173 PerfData::U_Ticks, (jlong) cms_size_policy()->cms_gc_cost(), CHECK);
duke@435 174
duke@435 175 cname = PerfDataManager::counter_name(name_space(), "avgPromotedAvg");
duke@435 176 _promoted_avg_counter =
duke@435 177 PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Bytes,
duke@435 178 cms_size_policy()->calculated_promo_size_in_bytes(), CHECK);
duke@435 179
duke@435 180 cname = PerfDataManager::counter_name(name_space(), "avgPromotedDev");
duke@435 181 _promoted_avg_dev_counter =
duke@435 182 PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Bytes,
duke@435 183 (jlong) 0 , CHECK);
duke@435 184
duke@435 185 cname = PerfDataManager::counter_name(name_space(), "avgPromotedPaddedAvg");
duke@435 186 _promoted_padded_avg_counter =
duke@435 187 PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Bytes,
duke@435 188 cms_size_policy()->calculated_promo_size_in_bytes(), CHECK);
duke@435 189
duke@435 190 cname = PerfDataManager::counter_name(name_space(),
duke@435 191 "changeYoungGenForMajPauses");
duke@435 192 _change_young_gen_for_maj_pauses_counter =
duke@435 193 PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
duke@435 194 (jlong)0, CHECK);
duke@435 195
duke@435 196 cname = PerfDataManager::counter_name(name_space(), "remarkPauseOldSlope");
duke@435 197 _remark_pause_old_slope_counter =
duke@435 198 PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Bytes,
duke@435 199 (jlong) cms_size_policy()->remark_pause_old_slope(), CHECK);
duke@435 200
duke@435 201 cname = PerfDataManager::counter_name(name_space(), "initialPauseOldSlope");
duke@435 202 _initial_pause_old_slope_counter =
duke@435 203 PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Bytes,
duke@435 204 (jlong) cms_size_policy()->initial_pause_old_slope(), CHECK);
duke@435 205
duke@435 206 cname =
duke@435 207 PerfDataManager::counter_name(name_space(), "remarkPauseYoungSlope") ;
duke@435 208 _remark_pause_young_slope_counter =
duke@435 209 PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Bytes,
duke@435 210 (jlong) cms_size_policy()->remark_pause_young_slope(), CHECK);
duke@435 211
duke@435 212 cname =
duke@435 213 PerfDataManager::counter_name(name_space(), "initialPauseYoungSlope");
duke@435 214 _initial_pause_young_slope_counter =
duke@435 215 PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Bytes,
duke@435 216 (jlong) cms_size_policy()->initial_pause_young_slope(), CHECK);
duke@435 217
duke@435 218
duke@435 219 }
duke@435 220 assert(size_policy()->is_gc_cms_adaptive_size_policy(),
duke@435 221 "Wrong type of size policy");
duke@435 222 }
duke@435 223
duke@435 224 void CMSGCAdaptivePolicyCounters::update_counters() {
duke@435 225 if (UsePerfData) {
duke@435 226 GCAdaptivePolicyCounters::update_counters_from_policy();
duke@435 227 update_counters_from_policy();
duke@435 228 }
duke@435 229 }
duke@435 230
duke@435 231 void CMSGCAdaptivePolicyCounters::update_counters(CMSGCStats* gc_stats) {
duke@435 232 if (UsePerfData) {
duke@435 233 update_counters();
duke@435 234 update_promoted((size_t) gc_stats->avg_promoted()->last_sample());
duke@435 235 update_avg_promoted_avg(gc_stats);
duke@435 236 update_avg_promoted_dev(gc_stats);
duke@435 237 update_avg_promoted_padded_avg(gc_stats);
duke@435 238 }
duke@435 239 }
duke@435 240
duke@435 241 void CMSGCAdaptivePolicyCounters::update_counters_from_policy() {
duke@435 242 if (UsePerfData && (cms_size_policy() != NULL)) {
duke@435 243
duke@435 244 GCAdaptivePolicyCounters::update_counters_from_policy();
duke@435 245
duke@435 246 update_major_gc_cost_counter();
duke@435 247 update_mutator_cost_counter();
duke@435 248
duke@435 249 update_eden_size();
duke@435 250 update_promo_size();
duke@435 251
duke@435 252 // If these updates from the last_sample() work,
duke@435 253 // revise the update methods for these counters
duke@435 254 // (both here and in PS).
duke@435 255 update_survived((size_t) cms_size_policy()->avg_survived()->last_sample());
duke@435 256
duke@435 257 update_avg_concurrent_time_counter();
duke@435 258 update_avg_concurrent_interval_counter();
duke@435 259 update_avg_concurrent_gc_cost_counter();
duke@435 260 #ifdef NOT_PRODUCT
duke@435 261 update_initial_pause_counter();
duke@435 262 update_remark_pause_counter();
duke@435 263 #endif
duke@435 264 update_avg_initial_pause_counter();
duke@435 265 update_avg_remark_pause_counter();
duke@435 266
duke@435 267 update_avg_cms_STW_time_counter();
duke@435 268 update_avg_cms_STW_gc_cost_counter();
duke@435 269
duke@435 270 update_avg_cms_free_counter();
duke@435 271 update_avg_cms_free_at_sweep_counter();
duke@435 272 update_avg_cms_promo_counter();
duke@435 273
duke@435 274 update_avg_msc_pause_counter();
duke@435 275 update_avg_msc_interval_counter();
duke@435 276 update_msc_gc_cost_counter();
duke@435 277
duke@435 278 update_avg_ms_pause_counter();
duke@435 279 update_avg_ms_interval_counter();
duke@435 280 update_ms_gc_cost_counter();
duke@435 281
duke@435 282 update_avg_old_live_counter();
duke@435 283
duke@435 284 update_survivor_size_counters();
duke@435 285 update_avg_survived_avg_counters();
duke@435 286 update_avg_survived_dev_counters();
duke@435 287
duke@435 288 update_decrement_tenuring_threshold_for_gc_cost();
duke@435 289 update_increment_tenuring_threshold_for_gc_cost();
duke@435 290 update_decrement_tenuring_threshold_for_survivor_limit();
duke@435 291
duke@435 292 update_change_young_gen_for_maj_pauses();
duke@435 293
duke@435 294 update_major_collection_slope_counter();
duke@435 295 update_remark_pause_old_slope_counter();
duke@435 296 update_initial_pause_old_slope_counter();
duke@435 297 update_remark_pause_young_slope_counter();
duke@435 298 update_initial_pause_young_slope_counter();
duke@435 299
duke@435 300 update_decide_at_full_gc_counter();
duke@435 301 }
duke@435 302 }

mercurial