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