Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/share/vm/gc_implementation/g1/g1ErgoVerbose.hpp
38920 views
1
/*
2
* Copyright (c) 2011, 2012, 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_VM_GC_IMPLEMENTATION_G1_G1ERGOVERBOSE_HPP
26
#define SHARE_VM_GC_IMPLEMENTATION_G1_G1ERGOVERBOSE_HPP
27
28
#include "memory/allocation.hpp"
29
#include "utilities/debug.hpp"
30
31
// The log of G1's heuristic decisions comprises of a series of
32
// records which have a similar format in order to maintain
33
// consistency across records and ultimately easier parsing of the
34
// output, if we ever choose to do that. Each record consists of:
35
// * A time stamp to be able to easily correlate each record with
36
// other events.
37
// * A unique string to allow us to easily identify such records.
38
// * The name of the heuristic the record corresponds to.
39
// * An action string which describes the action that G1 did or is
40
// about to do.
41
// * An optional reason string which describes the reason for the
42
// action.
43
// * An optional number of name/value pairs which contributed to the
44
// decision to take the action described in the record.
45
//
46
// Each record is associated with a "tag" which is the combination of
47
// the heuristic the record corresponds to, as well as the min level
48
// of verboseness at which the record should be printed. The tag is
49
// checked against the current settings to determine whether the record
50
// should be printed or not.
51
52
// The available verboseness levels.
53
typedef enum {
54
// Determine which part of the tag is occupied by the level.
55
ErgoLevelShift = 8,
56
ErgoLevelMask = ~((1 << ErgoLevelShift) - 1),
57
58
// ErgoLow is 0 so that we don't have to explicitly or a heuristic
59
// id with ErgoLow to keep its use simpler.
60
ErgoLow = 0,
61
ErgoHigh = 1 << ErgoLevelShift
62
} ErgoLevel;
63
64
// The available heuristics.
65
typedef enum {
66
// Determines which part of the tag is occupied by the heuristic id.
67
ErgoHeuristicMask = ~ErgoLevelMask,
68
69
ErgoHeapSizing = 0,
70
ErgoCSetConstruction,
71
ErgoConcCycles,
72
ErgoMixedGCs,
73
74
ErgoHeuristicNum
75
} ErgoHeuristic;
76
77
class G1ErgoVerbose : AllStatic {
78
private:
79
// Determines the minimum verboseness level at which records will be
80
// printed.
81
static ErgoLevel _level;
82
// Determines which heuristics are currently enabled.
83
static bool _enabled[ErgoHeuristicNum];
84
85
static ErgoLevel extract_level(int tag) {
86
return (ErgoLevel) (tag & ErgoLevelMask);
87
}
88
89
static ErgoHeuristic extract_heuristic(int tag) {
90
return (ErgoHeuristic) (tag & ErgoHeuristicMask);
91
}
92
93
public:
94
// Needs to be explicitly called at GC initialization.
95
static void initialize();
96
97
static void set_level(ErgoLevel level);
98
static void set_enabled(ErgoHeuristic h, bool enabled);
99
// It is applied to all heuristics.
100
static void set_enabled(bool enabled);
101
102
static bool enabled(int tag) {
103
ErgoLevel level = extract_level(tag);
104
ErgoHeuristic n = extract_heuristic(tag);
105
return level <= _level && _enabled[n];
106
}
107
108
// Extract the heuristic id from the tag and return a string with
109
// its name.
110
static const char* to_string(int tag);
111
};
112
113
// The macros below generate the format string for values of different
114
// types and/or metrics.
115
116
// The reason for the action is optional and is handled specially: the
117
// reason string is concatenated here so it's not necessary to pass it
118
// as a parameter.
119
#define ergo_format_reason(_reason_) ", reason: " _reason_
120
121
// Single parameter format strings
122
#define ergo_format_str(_name_) ", " _name_ ": %s"
123
#define ergo_format_region(_name_) ", " _name_ ": %u regions"
124
#define ergo_format_byte(_name_) ", " _name_ ": " SIZE_FORMAT " bytes"
125
#define ergo_format_double(_name_) ", " _name_ ": %1.2f"
126
#define ergo_format_perc(_name_) ", " _name_ ": %1.2f %%"
127
#define ergo_format_ms(_name_) ", " _name_ ": %1.2f ms"
128
#define ergo_format_size(_name_) ", " _name_ ": " SIZE_FORMAT
129
130
// Double parameter format strings
131
#define ergo_format_byte_perc(_name_) \
132
", " _name_ ": " SIZE_FORMAT " bytes (%1.2f %%)"
133
134
// Generates the format string
135
#define ergo_format(_extra_format_) \
136
" %1.3f: [G1Ergonomics (%s) %s" _extra_format_ "]"
137
138
// Conditionally, prints an ergonomic decision record. _extra_format_
139
// is the format string for the optional items we'd like to print
140
// (i.e., the decision's reason and any associated values). This
141
// string should be built up using the ergo_*_format macros (see
142
// above) to ensure consistency.
143
//
144
// Since we cannot rely on the compiler supporting variable argument
145
// macros, this macro accepts a fixed number of arguments and passes
146
// them to the print method. For convenience, we have wrapper macros
147
// below which take a specific number of arguments and set the rest to
148
// a default value.
149
#define ergo_verbose_common(_tag_, _action_, _extra_format_, \
150
_arg0_, _arg1_, _arg2_, _arg3_, _arg4_, _arg5_) \
151
do { \
152
if (G1ErgoVerbose::enabled((_tag_))) { \
153
gclog_or_tty->print_cr(ergo_format(_extra_format_), \
154
os::elapsedTime(), \
155
G1ErgoVerbose::to_string((_tag_)), \
156
(_action_), \
157
(_arg0_), (_arg1_), (_arg2_), \
158
(_arg3_), (_arg4_), (_arg5_)); \
159
} \
160
} while (0)
161
162
163
#define ergo_verbose6(_tag_, _action_, _extra_format_, \
164
_arg0_, _arg1_, _arg2_, _arg3_, _arg4_, _arg5_) \
165
ergo_verbose_common(_tag_, _action_, _extra_format_, \
166
_arg0_, _arg1_, _arg2_, _arg3_, _arg4_, _arg5_)
167
168
#define ergo_verbose5(_tag_, _action_, _extra_format_, \
169
_arg0_, _arg1_, _arg2_, _arg3_, _arg4_) \
170
ergo_verbose6(_tag_, _action_, _extra_format_ "%s", \
171
_arg0_, _arg1_, _arg2_, _arg3_, _arg4_, "")
172
173
#define ergo_verbose4(_tag_, _action_, _extra_format_, \
174
_arg0_, _arg1_, _arg2_, _arg3_) \
175
ergo_verbose5(_tag_, _action_, _extra_format_ "%s", \
176
_arg0_, _arg1_, _arg2_, _arg3_, "")
177
178
#define ergo_verbose3(_tag_, _action_, _extra_format_, \
179
_arg0_, _arg1_, _arg2_) \
180
ergo_verbose4(_tag_, _action_, _extra_format_ "%s", \
181
_arg0_, _arg1_, _arg2_, "")
182
183
#define ergo_verbose2(_tag_, _action_, _extra_format_, \
184
_arg0_, _arg1_) \
185
ergo_verbose3(_tag_, _action_, _extra_format_ "%s", \
186
_arg0_, _arg1_, "")
187
188
#define ergo_verbose1(_tag_, _action_, _extra_format_, \
189
_arg0_) \
190
ergo_verbose2(_tag_, _action_, _extra_format_ "%s", \
191
_arg0_, "")
192
193
194
#define ergo_verbose0(_tag_, _action_, _extra_format_) \
195
ergo_verbose1(_tag_, _action_, _extra_format_ "%s", \
196
"")
197
198
#define ergo_verbose(_tag_, _action_) \
199
ergo_verbose0(_tag_, _action_, "")
200
201
202
#endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1ERGOVERBOSE_HPP
203
204