0N/A/*
1879N/A * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
0N/A * published by the Free Software Foundation.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
1472N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
1472N/A * or visit www.oracle.com if you need additional information or have any
1472N/A * questions.
0N/A *
0N/A */
0N/A
1879N/A#include "precompiled.hpp"
1879N/A#include "gc_implementation/shared/gcAdaptivePolicyCounters.hpp"
1879N/A#include "memory/resourceArea.hpp"
0N/A
0N/A// This class keeps statistical information and computes the
0N/A// size of the heap.
0N/A
0N/AGCAdaptivePolicyCounters::GCAdaptivePolicyCounters(const char* name,
0N/A int collectors,
0N/A int generations,
0N/A AdaptiveSizePolicy* size_policy_arg)
0N/A : GCPolicyCounters(name, collectors, generations),
0N/A _size_policy(size_policy_arg) {
0N/A if (UsePerfData) {
0N/A EXCEPTION_MARK;
0N/A ResourceMark rm;
0N/A
0N/A const char* cname = PerfDataManager::counter_name(name_space(), "edenSize");
0N/A _eden_size_counter = PerfDataManager::create_variable(SUN_GC, cname,
0N/A PerfData::U_Bytes, _size_policy->calculated_eden_size_in_bytes(), CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(), "promoSize");
0N/A _promo_size_counter = PerfDataManager::create_variable(SUN_GC, cname,
0N/A PerfData::U_Bytes, size_policy()->calculated_promo_size_in_bytes(),
0N/A CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(), "youngCapacity");
0N/A size_t young_capacity_in_bytes =
0N/A _size_policy->calculated_eden_size_in_bytes() +
0N/A _size_policy->calculated_survivor_size_in_bytes();
0N/A _young_capacity_counter = PerfDataManager::create_variable(SUN_GC, cname,
0N/A PerfData::U_Bytes, young_capacity_in_bytes, CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(), "avgSurvivedAvg");
0N/A _avg_survived_avg_counter = PerfDataManager::create_variable(SUN_GC, cname,
0N/A PerfData::U_Bytes, size_policy()->calculated_survivor_size_in_bytes(),
0N/A CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(), "avgSurvivedDev");
0N/A _avg_survived_dev_counter = PerfDataManager::create_variable(SUN_GC, cname,
0N/A PerfData::U_Bytes, (jlong) 0 , CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(), "avgSurvivedPaddedAvg");
0N/A _avg_survived_padded_avg_counter =
0N/A PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Bytes,
0N/A size_policy()->calculated_survivor_size_in_bytes(), CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(), "avgMinorPauseTime");
0N/A _avg_minor_pause_counter = PerfDataManager::create_variable(SUN_GC, cname,
0N/A PerfData::U_Ticks, (jlong) _size_policy->_avg_minor_pause->average(),
0N/A CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(), "avgMinorIntervalTime");
0N/A _avg_minor_interval_counter = PerfDataManager::create_variable(SUN_GC,
0N/A cname,
0N/A PerfData::U_Ticks,
0N/A (jlong) _size_policy->_avg_minor_interval->average(),
0N/A CHECK);
0N/A
0N/A#ifdef NOT_PRODUCT
0N/A // This is a counter for the most recent minor pause time
0N/A // (the last sample, not the average). It is useful for
0N/A // verifying the average pause time but not worth putting
0N/A // into the product.
0N/A cname = PerfDataManager::counter_name(name_space(), "minorPauseTime");
0N/A _minor_pause_counter = PerfDataManager::create_variable(SUN_GC, cname,
0N/A PerfData::U_Ticks, (jlong) _size_policy->_avg_minor_pause->last_sample(),
0N/A CHECK);
0N/A#endif
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(), "minorGcCost");
0N/A _minor_gc_cost_counter = PerfDataManager::create_variable(SUN_GC,
0N/A cname,
0N/A PerfData::U_Ticks,
0N/A (jlong) _size_policy->minor_gc_cost(),
0N/A CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(), "mutatorCost");
0N/A _mutator_cost_counter = PerfDataManager::create_variable(SUN_GC, cname,
0N/A PerfData::U_Ticks, (jlong) _size_policy->mutator_cost(), CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(), "survived");
0N/A _survived_counter = PerfDataManager::create_variable(SUN_GC, cname,
0N/A PerfData::U_Bytes, (jlong) 0, CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(), "promoted");
0N/A _promoted_counter = PerfDataManager::create_variable(SUN_GC, cname,
0N/A PerfData::U_Bytes, (jlong) 0, CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(), "avgYoungLive");
0N/A _avg_young_live_counter = PerfDataManager::create_variable(SUN_GC, cname,
0N/A PerfData::U_Bytes, (jlong) size_policy()->avg_young_live()->average(),
0N/A CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(), "avgOldLive");
0N/A _avg_old_live_counter = PerfDataManager::create_variable(SUN_GC, cname,
0N/A PerfData::U_Bytes, (jlong) size_policy()->avg_old_live()->average(),
0N/A CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(), "survivorOverflowed");
0N/A _survivor_overflowed_counter = PerfDataManager::create_variable(SUN_GC, cname,
0N/A PerfData::U_Events, (jlong)0, CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(),
0N/A "decrementTenuringThresholdForGcCost");
0N/A _decrement_tenuring_threshold_for_gc_cost_counter =
0N/A PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
0N/A (jlong)0, CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(),
0N/A "incrementTenuringThresholdForGcCost");
0N/A _increment_tenuring_threshold_for_gc_cost_counter =
0N/A PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
0N/A (jlong)0, CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(),
0N/A "decrementTenuringThresholdForSurvivorLimit");
0N/A _decrement_tenuring_threshold_for_survivor_limit_counter =
0N/A PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
0N/A (jlong)0, CHECK);
0N/A cname = PerfDataManager::counter_name(name_space(),
0N/A "changeYoungGenForMinPauses");
0N/A _change_young_gen_for_min_pauses_counter =
0N/A PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
0N/A (jlong)0, CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(),
0N/A "changeOldGenForMajPauses");
0N/A _change_old_gen_for_maj_pauses_counter =
0N/A PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
0N/A (jlong)0, CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(),
0N/A "increaseOldGenForThroughput");
0N/A _change_old_gen_for_throughput_counter =
0N/A PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
0N/A (jlong)0, CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(),
0N/A "increaseYoungGenForThroughput");
0N/A _change_young_gen_for_throughput_counter =
0N/A PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
0N/A (jlong)0, CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(),
0N/A "decreaseForFootprint");
0N/A _decrease_for_footprint_counter =
0N/A PerfDataManager::create_variable(SUN_GC, cname,
0N/A PerfData::U_Events, (jlong)0, CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(), "decideAtFullGc");
0N/A _decide_at_full_gc_counter = PerfDataManager::create_variable(SUN_GC, cname,
0N/A PerfData::U_None, (jlong)0, CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(), "minorPauseYoungSlope");
0N/A _minor_pause_young_slope_counter =
0N/A PerfDataManager::create_variable(SUN_GC, cname,
0N/A PerfData::U_None, (jlong) 0, CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(), "majorCollectionSlope");
0N/A _major_collection_slope_counter =
0N/A PerfDataManager::create_variable(SUN_GC, cname,
0N/A PerfData::U_None, (jlong) 0, CHECK);
0N/A
0N/A cname = PerfDataManager::counter_name(name_space(), "minorCollectionSlope");
0N/A _minor_collection_slope_counter =
0N/A PerfDataManager::create_variable(SUN_GC, cname,
0N/A PerfData::U_None, (jlong) 0, CHECK);
0N/A }
0N/A}
0N/A
0N/Avoid GCAdaptivePolicyCounters::update_counters_from_policy() {
0N/A if (UsePerfData && (size_policy() != NULL)) {
0N/A update_avg_minor_pause_counter();
0N/A update_avg_minor_interval_counter();
0N/A#ifdef NOT_PRODUCT
0N/A update_minor_pause_counter();
0N/A#endif
0N/A update_minor_gc_cost_counter();
0N/A update_avg_young_live_counter();
0N/A
0N/A update_survivor_size_counters();
0N/A update_avg_survived_avg_counters();
0N/A update_avg_survived_dev_counters();
0N/A update_avg_survived_padded_avg_counters();
0N/A
0N/A update_change_old_gen_for_throughput();
0N/A update_change_young_gen_for_throughput();
0N/A update_decrease_for_footprint();
0N/A update_change_young_gen_for_min_pauses();
0N/A update_change_old_gen_for_maj_pauses();
0N/A
0N/A update_minor_pause_young_slope_counter();
0N/A update_minor_collection_slope_counter();
0N/A update_major_collection_slope_counter();
0N/A }
0N/A}
0N/A
0N/Avoid GCAdaptivePolicyCounters::update_counters() {
0N/A if (UsePerfData) {
0N/A update_counters_from_policy();
0N/A }
0N/A}