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 // This class keeps statistical information and computes the 26 // size of the heap. 27 28 class GCAdaptivePolicyCounters : public GCPolicyCounters { 29 protected: 30 PerfVariable* _eden_size_counter; 31 PerfVariable* _promo_size_counter; 32 33 PerfVariable* _young_capacity_counter; 34 35 PerfVariable* _minor_gc_cost_counter; 36 PerfVariable* _major_gc_cost_counter; 37 PerfVariable* _mutator_cost_counter; 38 39 PerfVariable* _avg_young_live_counter; 40 PerfVariable* _avg_old_live_counter; 41 42 PerfVariable* _avg_minor_pause_counter; 43 PerfVariable* _avg_minor_interval_counter; 44 45 #ifdef NOT_PRODUCT 46 PerfVariable* _minor_pause_counter; 47 #endif 48 49 PerfVariable* _change_young_gen_for_min_pauses_counter; 50 PerfVariable* _change_young_gen_for_throughput_counter; 51 PerfVariable* _change_old_gen_for_maj_pauses_counter; 52 PerfVariable* _change_old_gen_for_throughput_counter; 53 PerfVariable* _decrease_for_footprint_counter; 54 55 PerfVariable* _minor_pause_young_slope_counter; 56 PerfVariable* _major_pause_old_slope_counter; 57 58 PerfVariable* _decide_at_full_gc_counter; 59 60 PerfVariable* _survived_counter; 61 PerfVariable* _promoted_counter; 62 63 PerfVariable* _avg_survived_avg_counter; 64 PerfVariable* _avg_survived_dev_counter; 65 PerfVariable* _avg_survived_padded_avg_counter; 66 67 PerfVariable* _survivor_overflowed_counter; 68 PerfVariable* _increment_tenuring_threshold_for_gc_cost_counter; 69 PerfVariable* _decrement_tenuring_threshold_for_gc_cost_counter; 70 PerfVariable* _decrement_tenuring_threshold_for_survivor_limit_counter; 71 72 PerfVariable* _minor_collection_slope_counter; 73 PerfVariable* _major_collection_slope_counter; 74 75 AdaptiveSizePolicy* _size_policy; 76 77 inline void update_eden_size() { 78 size_t eden_size_in_bytes = size_policy()->calculated_eden_size_in_bytes(); 79 _eden_size_counter->set_value(eden_size_in_bytes); 80 } 81 82 inline void update_promo_size() { 83 _promo_size_counter->set_value( 84 size_policy()->calculated_promo_size_in_bytes()); 85 } 86 87 inline void update_avg_minor_pause_counter() { 88 _avg_minor_pause_counter->set_value((jlong) 89 (size_policy()->avg_minor_pause()->average() * 1000.0)); 90 } 91 inline void update_avg_minor_interval_counter() { 92 _avg_minor_interval_counter->set_value((jlong) 93 (size_policy()->avg_minor_interval()->average() * 1000.0)); 94 } 95 96 #ifdef NOT_PRODUCT 97 inline void update_minor_pause_counter() { 98 _minor_pause_counter->set_value((jlong) 99 (size_policy()->avg_minor_pause()->last_sample() * 1000.0)); 100 } 101 #endif 102 inline void update_minor_gc_cost_counter() { 103 _minor_gc_cost_counter->set_value((jlong) 104 (size_policy()->minor_gc_cost() * 100.0)); 105 } 106 107 inline void update_avg_young_live_counter() { 108 _avg_young_live_counter->set_value( 109 (jlong)(size_policy()->avg_young_live()->average()) 110 ); 111 } 112 113 inline void update_avg_survived_avg_counters() { 114 _avg_survived_avg_counter->set_value( 115 (jlong)(size_policy()->_avg_survived->average()) 116 ); 117 } 118 inline void update_avg_survived_dev_counters() { 119 _avg_survived_dev_counter->set_value( 120 (jlong)(size_policy()->_avg_survived->deviation()) 121 ); 122 } 123 inline void update_avg_survived_padded_avg_counters() { 124 _avg_survived_padded_avg_counter->set_value( 125 (jlong)(size_policy()->_avg_survived->padded_average()) 126 ); 127 } 128 129 inline void update_change_old_gen_for_throughput() { 130 _change_old_gen_for_throughput_counter->set_value( 131 size_policy()->change_old_gen_for_throughput()); 132 } 133 inline void update_change_young_gen_for_throughput() { 134 _change_young_gen_for_throughput_counter->set_value( 135 size_policy()->change_young_gen_for_throughput()); 136 } 137 inline void update_decrease_for_footprint() { 138 _decrease_for_footprint_counter->set_value( 139 size_policy()->decrease_for_footprint()); 140 } 141 142 inline void update_decide_at_full_gc_counter() { 143 _decide_at_full_gc_counter->set_value( 144 size_policy()->decide_at_full_gc()); 145 } 146 147 inline void update_minor_pause_young_slope_counter() { 148 _minor_pause_young_slope_counter->set_value( 149 (jlong)(size_policy()->minor_pause_young_slope() * 1000) 150 ); 151 } 152 153 virtual void update_counters_from_policy(); 154 155 protected: 156 virtual AdaptiveSizePolicy* size_policy() { return _size_policy; } 157 158 public: 159 GCAdaptivePolicyCounters(const char* name, 160 int collectors, 161 int generations, 162 AdaptiveSizePolicy* size_policy); 163 164 inline void update_survived(size_t survived) { 165 _survived_counter->set_value(survived); 166 } 167 inline void update_promoted(size_t promoted) { 168 _promoted_counter->set_value(promoted); 169 } 170 inline void update_young_capacity(size_t size_in_bytes) { 171 _young_capacity_counter->set_value(size_in_bytes); 172 } 173 174 virtual void update_counters(); 175 176 inline void update_survivor_size_counters() { 177 desired_survivor_size()->set_value( 178 size_policy()->calculated_survivor_size_in_bytes()); 179 } 180 inline void update_survivor_overflowed(bool survivor_overflowed) { 181 _survivor_overflowed_counter->set_value(survivor_overflowed); 182 } 183 inline void update_tenuring_threshold(int threshold) { 184 tenuring_threshold()->set_value(threshold); 185 } 186 inline void update_increment_tenuring_threshold_for_gc_cost() { 187 _increment_tenuring_threshold_for_gc_cost_counter->set_value( 188 size_policy()->increment_tenuring_threshold_for_gc_cost()); 189 } 190 inline void update_decrement_tenuring_threshold_for_gc_cost() { 191 _decrement_tenuring_threshold_for_gc_cost_counter->set_value( 192 size_policy()->decrement_tenuring_threshold_for_gc_cost()); 193 } 194 inline void update_decrement_tenuring_threshold_for_survivor_limit() { 195 _decrement_tenuring_threshold_for_survivor_limit_counter->set_value( 196 size_policy()->decrement_tenuring_threshold_for_survivor_limit()); 197 } 198 inline void update_change_young_gen_for_min_pauses() { 199 _change_young_gen_for_min_pauses_counter->set_value( 200 size_policy()->change_young_gen_for_min_pauses()); 201 } 202 inline void update_change_old_gen_for_maj_pauses() { 203 _change_old_gen_for_maj_pauses_counter->set_value( 204 size_policy()->change_old_gen_for_maj_pauses()); 205 } 206 207 inline void update_minor_collection_slope_counter() { 208 _minor_collection_slope_counter->set_value( 209 (jlong)(size_policy()->minor_collection_slope() * 1000) 210 ); 211 } 212 213 inline void update_major_collection_slope_counter() { 214 _major_collection_slope_counter->set_value( 215 (jlong)(size_policy()->major_collection_slope() * 1000) 216 ); 217 } 218 219 void set_size_policy(AdaptiveSizePolicy* v) { _size_policy = v; } 220 221 virtual GCPolicyCounters::Name kind() const { 222 return GCPolicyCounters::GCAdaptivePolicyCountersKind; 223 } 224 };