Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/hotspot/share/gc/parallel/psGCAdaptivePolicyCounters.hpp
41152 views
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
36
class 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
57
PerfVariable* _change_old_gen_for_min_pauses;
58
PerfVariable* _change_young_gen_for_maj_pauses_counter;
59
60
PerfVariable* _major_pause_old_slope;
61
PerfVariable* _minor_pause_old_slope;
62
PerfVariable* _major_pause_young_slope;
63
64
PerfVariable* _scavenge_skipped;
65
PerfVariable* _full_follows_scavenge;
66
67
// Use this time stamp if the gc time stamp is not available.
68
TimeStamp _counter_time_stamp;
69
70
protected:
71
PSAdaptiveSizePolicy* ps_size_policy() {
72
return (PSAdaptiveSizePolicy*)_size_policy;
73
}
74
75
public:
76
PSGCAdaptivePolicyCounters(const char* name, int collectors, int generations,
77
PSAdaptiveSizePolicy* size_policy);
78
inline void update_old_capacity(size_t size_in_bytes) {
79
_old_capacity->set_value(size_in_bytes);
80
}
81
inline void update_old_eden_size(size_t old_size) {
82
_old_eden_size->set_value(old_size);
83
}
84
inline void update_old_promo_size(size_t old_size) {
85
_old_promo_size->set_value(old_size);
86
}
87
inline void update_avg_promoted_avg() {
88
_avg_promoted_avg_counter->set_value(
89
(jlong)(ps_size_policy()->avg_promoted()->average())
90
);
91
}
92
inline void update_avg_promoted_dev() {
93
_avg_promoted_dev_counter->set_value(
94
(jlong)(ps_size_policy()->avg_promoted()->deviation())
95
);
96
}
97
inline void update_avg_promoted_padded_avg() {
98
_avg_promoted_padded_avg_counter->set_value(
99
(jlong)(ps_size_policy()->avg_promoted()->padded_average())
100
);
101
}
102
103
inline void update_avg_pretenured_padded_avg() {
104
_avg_pretenured_padded_avg->set_value(
105
(jlong)(ps_size_policy()->_avg_pretenured->padded_average())
106
);
107
}
108
inline void update_change_young_gen_for_maj_pauses() {
109
_change_young_gen_for_maj_pauses_counter->set_value(
110
ps_size_policy()->change_young_gen_for_maj_pauses());
111
}
112
inline void update_change_old_gen_for_min_pauses() {
113
_change_old_gen_for_min_pauses->set_value(
114
ps_size_policy()->change_old_gen_for_min_pauses());
115
}
116
117
// compute_generations_free_space() statistics
118
119
inline void update_avg_major_pause() {
120
_avg_major_pause->set_value(
121
(jlong)(ps_size_policy()->_avg_major_pause->average() * 1000.0)
122
);
123
}
124
inline void update_avg_major_interval() {
125
_avg_major_interval->set_value(
126
(jlong)(ps_size_policy()->_avg_major_interval->average() * 1000.0)
127
);
128
}
129
130
inline void update_major_gc_cost_counter() {
131
_major_gc_cost_counter->set_value(
132
(jlong)(ps_size_policy()->major_gc_cost() * 100.0)
133
);
134
}
135
inline void update_mutator_cost_counter() {
136
_mutator_cost_counter->set_value(
137
(jlong)(ps_size_policy()->mutator_cost() * 100.0)
138
);
139
}
140
141
inline void update_live_space() {
142
_live_space->set_value(ps_size_policy()->live_space());
143
}
144
inline void update_free_space() {
145
_free_space->set_value(ps_size_policy()->free_space());
146
}
147
148
inline void update_avg_base_footprint() {
149
_avg_base_footprint->set_value(
150
(jlong)(ps_size_policy()->avg_base_footprint()->average())
151
);
152
}
153
inline void update_avg_old_live() {
154
_avg_old_live_counter->set_value(
155
(jlong)(ps_size_policy()->avg_old_live()->average())
156
);
157
}
158
// Scale up all the slopes
159
inline void update_major_pause_old_slope() {
160
_major_pause_old_slope->set_value(
161
(jlong)(ps_size_policy()->major_pause_old_slope() * 1000)
162
);
163
}
164
inline void update_minor_pause_old_slope() {
165
_minor_pause_old_slope->set_value(
166
(jlong)(ps_size_policy()->minor_pause_old_slope() * 1000)
167
);
168
}
169
inline void update_major_pause_young_slope() {
170
_major_pause_young_slope->set_value(
171
(jlong)(ps_size_policy()->major_pause_young_slope() * 1000)
172
);
173
}
174
inline void update_gc_overhead_limit_exceeded_counter() {
175
gc_overhead_limit_exceeded_counter()->set_value(
176
(jlong) ps_size_policy()->gc_overhead_limit_exceeded());
177
}
178
inline void update_live_at_last_full_gc_counter() {
179
_live_at_last_full_gc_counter->set_value(
180
(jlong)(ps_size_policy()->live_at_last_full_gc()));
181
}
182
183
inline void update_scavenge_skipped(int cause) {
184
_scavenge_skipped->set_value(cause);
185
}
186
187
inline void update_full_follows_scavenge(int event) {
188
_full_follows_scavenge->set_value(event);
189
}
190
191
// Update all the counters that can be updated from the size policy.
192
// This should be called after all policy changes have been made
193
// and reflected internally in the size policy.
194
void update_counters_from_policy();
195
196
// Update counters that can be updated from fields internal to the
197
// counter or from globals. This is distinguished from counters
198
// that are updated via input parameters.
199
void update_counters();
200
201
virtual GCPolicyCounters::Name kind() const {
202
return GCPolicyCounters::PSGCAdaptivePolicyCountersKind;
203
}
204
};
205
206
#endif // SHARE_GC_PARALLEL_PSGCADAPTIVEPOLICYCOUNTERS_HPP
207
208