1/*
2 * Copyright (c) 2003, 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_PSGCADAPTIVEPOLICYCOUNTERS_HPP
26#define SHARE_GC_PARALLEL_PSGCADAPTIVEPOLICYCOUNTERS_HPP
27
28#include "gc/parallel/gcAdaptivePolicyCounters.hpp"
29#include "gc/parallel/psAdaptiveSizePolicy.hpp"
30#include "gc/shared/gcPolicyCounters.hpp"
31
32// PSGCAdaptivePolicyCounters is a holder class for performance counters
33// that track the data and decisions for the ergonomics policy for the
34// parallel scavenge collector.
35
36class PSGCAdaptivePolicyCounters : public GCAdaptivePolicyCounters {
37 friend class VMStructs;
38
39 private:
40 // survivor space vs. tenuring threshold
41 PerfVariable* _old_promo_size;
42 PerfVariable* _old_eden_size;
43 PerfVariable* _avg_promoted_avg_counter;
44 PerfVariable* _avg_promoted_dev_counter;
45 PerfVariable* _avg_promoted_padded_avg_counter;
46 PerfVariable* _avg_pretenured_padded_avg;
47
48 // young gen vs. old gen sizing
49 PerfVariable* _avg_major_pause;
50 PerfVariable* _avg_major_interval;
51 PerfVariable* _live_space;
52 PerfVariable* _free_space;
53 PerfVariable* _avg_base_footprint;
54 PerfVariable* _live_at_last_full_gc_counter;
55 PerfVariable* _old_capacity;
56 PerfVariable* _boundary_moved;
57
58 PerfVariable* _change_old_gen_for_min_pauses;
59 PerfVariable* _change_young_gen_for_maj_pauses_counter;
60
61 PerfVariable* _major_pause_old_slope;
62 PerfVariable* _minor_pause_old_slope;
63 PerfVariable* _major_pause_young_slope;
64
65 PerfVariable* _scavenge_skipped;
66 PerfVariable* _full_follows_scavenge;
67
68 // Use this time stamp if the gc time stamp is not available.
69 TimeStamp _counter_time_stamp;
70
71 protected:
72 PSAdaptiveSizePolicy* ps_size_policy() {
73 return (PSAdaptiveSizePolicy*)_size_policy;
74 }
75
76 public:
77 PSGCAdaptivePolicyCounters(const char* name, int collectors, int generations,
78 PSAdaptiveSizePolicy* size_policy);
79 inline void update_old_capacity(size_t size_in_bytes) {
80 _old_capacity->set_value(size_in_bytes);
81 }
82 inline void update_old_eden_size(size_t old_size) {
83 _old_eden_size->set_value(old_size);
84 }
85 inline void update_old_promo_size(size_t old_size) {
86 _old_promo_size->set_value(old_size);
87 }
88 inline void update_boundary_moved(int size_in_bytes) {
89 _boundary_moved->set_value(size_in_bytes);
90 }
91 inline void update_avg_promoted_avg() {
92 _avg_promoted_avg_counter->set_value(
93 (jlong)(ps_size_policy()->avg_promoted()->average())
94 );
95 }
96 inline void update_avg_promoted_dev() {
97 _avg_promoted_dev_counter->set_value(
98 (jlong)(ps_size_policy()->avg_promoted()->deviation())
99 );
100 }
101 inline void update_avg_promoted_padded_avg() {
102 _avg_promoted_padded_avg_counter->set_value(
103 (jlong)(ps_size_policy()->avg_promoted()->padded_average())
104 );
105 }
106
107 inline void update_avg_pretenured_padded_avg() {
108 _avg_pretenured_padded_avg->set_value(
109 (jlong)(ps_size_policy()->_avg_pretenured->padded_average())
110 );
111 }
112 inline void update_change_young_gen_for_maj_pauses() {
113 _change_young_gen_for_maj_pauses_counter->set_value(
114 ps_size_policy()->change_young_gen_for_maj_pauses());
115 }
116 inline void update_change_old_gen_for_min_pauses() {
117 _change_old_gen_for_min_pauses->set_value(
118 ps_size_policy()->change_old_gen_for_min_pauses());
119 }
120
121 // compute_generations_free_space() statistics
122
123 inline void update_avg_major_pause() {
124 _avg_major_pause->set_value(
125 (jlong)(ps_size_policy()->_avg_major_pause->average() * 1000.0)
126 );
127 }
128 inline void update_avg_major_interval() {
129 _avg_major_interval->set_value(
130 (jlong)(ps_size_policy()->_avg_major_interval->average() * 1000.0)
131 );
132 }
133
134 inline void update_major_gc_cost_counter() {
135 _major_gc_cost_counter->set_value(
136 (jlong)(ps_size_policy()->major_gc_cost() * 100.0)
137 );
138 }
139 inline void update_mutator_cost_counter() {
140 _mutator_cost_counter->set_value(
141 (jlong)(ps_size_policy()->mutator_cost() * 100.0)
142 );
143 }
144
145 inline void update_live_space() {
146 _live_space->set_value(ps_size_policy()->live_space());
147 }
148 inline void update_free_space() {
149 _free_space->set_value(ps_size_policy()->free_space());
150 }
151
152 inline void update_avg_base_footprint() {
153 _avg_base_footprint->set_value(
154 (jlong)(ps_size_policy()->avg_base_footprint()->average())
155 );
156 }
157 inline void update_avg_old_live() {
158 _avg_old_live_counter->set_value(
159 (jlong)(ps_size_policy()->avg_old_live()->average())
160 );
161 }
162 // Scale up all the slopes
163 inline void update_major_pause_old_slope() {
164 _major_pause_old_slope->set_value(
165 (jlong)(ps_size_policy()->major_pause_old_slope() * 1000)
166 );
167 }
168 inline void update_minor_pause_old_slope() {
169 _minor_pause_old_slope->set_value(
170 (jlong)(ps_size_policy()->minor_pause_old_slope() * 1000)
171 );
172 }
173 inline void update_major_pause_young_slope() {
174 _major_pause_young_slope->set_value(
175 (jlong)(ps_size_policy()->major_pause_young_slope() * 1000)
176 );
177 }
178 inline void update_gc_overhead_limit_exceeded_counter() {
179 gc_overhead_limit_exceeded_counter()->set_value(
180 (jlong) ps_size_policy()->gc_overhead_limit_exceeded());
181 }
182 inline void update_live_at_last_full_gc_counter() {
183 _live_at_last_full_gc_counter->set_value(
184 (jlong)(ps_size_policy()->live_at_last_full_gc()));
185 }
186
187 inline void update_scavenge_skipped(int cause) {
188 _scavenge_skipped->set_value(cause);
189 }
190
191 inline void update_full_follows_scavenge(int event) {
192 _full_follows_scavenge->set_value(event);
193 }
194
195 // Update all the counters that can be updated from the size policy.
196 // This should be called after all policy changes have been made
197 // and reflected internally in the size policy.
198 void update_counters_from_policy();
199
200 // Update counters that can be updated from fields internal to the
201 // counter or from globals. This is distinguished from counters
202 // that are updated via input parameters.
203 void update_counters();
204
205 virtual GCPolicyCounters::Name kind() const {
206 return GCPolicyCounters::PSGCAdaptivePolicyCountersKind;
207 }
208};
209
210#endif // SHARE_GC_PARALLEL_PSGCADAPTIVEPOLICYCOUNTERS_HPP
211