Thu, 22 Sep 2011 10:57:37 -0700
6484982: G1: process references during evacuation pauses
Summary: G1 now uses two reference processors - one is used by concurrent marking and the other is used by STW GCs (both full and incremental evacuation pauses). In an evacuation pause, the reference processor is embedded into the closures used to scan objects. Doing so causes causes reference objects to be 'discovered' by the reference processor. At the end of the evacuation pause, these discovered reference objects are processed - preserving (and copying) referent objects (and their reachable graphs) as appropriate.
Reviewed-by: ysr, jwilhelm, brutisso, stefank, tonyp
1 /*
2 * Copyright (c) 2011, 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 */
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1ERGOVERBOSE_HPP
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1ERGOVERBOSE_HPP
28 #include "memory/allocation.hpp"
29 #include "utilities/debug.hpp"
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.
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),
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;
64 // The available heuristics.
65 typedef enum {
66 // Determines which part of the tag is occupied by the heuristic id.
67 ErgoHeuristicMask = ~ErgoLevelMask,
69 ErgoHeapSizing = 0,
70 ErgoCSetConstruction,
71 ErgoConcCycles,
72 ErgoPartiallyYoungGCs,
74 ErgoHeuristicNum
75 } ErgoHeuristic;
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];
85 static ErgoLevel extract_level(int tag) {
86 return (ErgoLevel) (tag & ErgoLevelMask);
87 }
89 static ErgoHeuristic extract_heuristic(int tag) {
90 return (ErgoHeuristic) (tag & ErgoHeuristicMask);
91 }
93 public:
94 // Needs to be explicitly called at GC initialization.
95 static void initialize();
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);
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 }
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 };
113 // The macros below generate the format string for values of different
114 // types and/or metrics.
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_
121 // Single parameter format strings
122 #define ergo_format_str(_name_) ", " _name_ ": %s"
123 #define ergo_format_region(_name_) ", " _name_ ": "SIZE_FORMAT" 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"
129 // Double parameter format strings
130 #define ergo_format_byte_perc(_name_) \
131 ", " _name_ ": "SIZE_FORMAT" bytes (%1.2f %%)"
133 // Generates the format string
134 #define ergo_format(_action_, _extra_format_) \
135 " %1.3f: [G1Ergonomics (%s) " _action_ _extra_format_ "]"
137 // Conditionally, prints an ergonomic decision record. _extra_format_
138 // is the format string for the optional items we'd like to print
139 // (i.e., the decision's reason and any associated values). This
140 // string should be built up using the ergo_*_format macros (see
141 // above) to ensure consistency.
142 //
143 // Since we cannot rely on the compiler supporting variable argument
144 // macros, this macro accepts a fixed number of arguments and passes
145 // them to the print method. For convenience, we have wrapper macros
146 // below which take a specific number of arguments and set the rest to
147 // a default value.
148 #define ergo_verbose_common(_tag_, _action_, _extra_format_, \
149 _arg0_, _arg1_, _arg2_, _arg3_, _arg4_, _arg5_) \
150 do { \
151 if (G1ErgoVerbose::enabled((_tag_))) { \
152 gclog_or_tty->print_cr(ergo_format(_action_, _extra_format_), \
153 os::elapsedTime(), \
154 G1ErgoVerbose::to_string((_tag_)), \
155 (_arg0_), (_arg1_), (_arg2_), \
156 (_arg3_), (_arg4_), (_arg5_)); \
157 } \
158 } while (0)
161 #define ergo_verbose(_tag_, _action_) \
162 ergo_verbose_common(_tag_, _action_, "", 0, 0, 0, 0, 0, 0)
164 #define ergo_verbose0(_tag_, _action_, _extra_format_) \
165 ergo_verbose_common(_tag_, _action_, _extra_format_, 0, 0, 0, 0, 0, 0)
167 #define ergo_verbose1(_tag_, _action_, _extra_format_, \
168 _arg0_) \
169 ergo_verbose_common(_tag_, _action_, _extra_format_, \
170 _arg0_, 0, 0, 0, 0, 0)
172 #define ergo_verbose2(_tag_, _action_, _extra_format_, \
173 _arg0_, _arg1_) \
174 ergo_verbose_common(_tag_, _action_, _extra_format_, \
175 _arg0_, _arg1_, 0, 0, 0, 0)
177 #define ergo_verbose3(_tag_, _action_, _extra_format_, \
178 _arg0_, _arg1_, _arg2_) \
179 ergo_verbose_common(_tag_, _action_, _extra_format_, \
180 _arg0_, _arg1_, _arg2_, 0, 0, 0)
182 #define ergo_verbose4(_tag_, _action_, _extra_format_, \
183 _arg0_, _arg1_, _arg2_, _arg3_) \
184 ergo_verbose_common(_tag_, _action_, _extra_format_, \
185 _arg0_, _arg1_, _arg2_, _arg3_, 0, 0)
187 #define ergo_verbose5(_tag_, _action_, _extra_format_, \
188 _arg0_, _arg1_, _arg2_, _arg3_, _arg4_) \
189 ergo_verbose_common(_tag_, _action_, _extra_format_, \
190 _arg0_, _arg1_, _arg2_, _arg3_, _arg4_, 0)
192 #define ergo_verbose6(_tag_, _action_, _extra_format_, \
193 _arg0_, _arg1_, _arg2_, _arg3_, _arg4_, _arg5_) \
194 ergo_verbose_common(_tag_, _action_, _extra_format_, \
195 _arg0_, _arg1_, _arg2_, _arg3_, _arg4_, _arg5_)
197 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1ERGOVERBOSE_HPP