1/*
2 * Copyright (c) 2004, 2015, 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/parallel/gcAdaptivePolicyCounters.hpp"
27#include "memory/resourceArea.hpp"
28
29// This class keeps statistical information and computes the
30// size of the heap.
31
32GCAdaptivePolicyCounters::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
196void 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
223void GCAdaptivePolicyCounters::update_counters() {
224 if (UsePerfData) {
225 update_counters_from_policy();
226 }
227}
228