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) 2003, 2010, 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 #include "precompiled.hpp"
26 #include "gc_implementation/parallelScavenge/psGCAdaptivePolicyCounters.hpp"
27 #include "memory/resourceArea.hpp"
28 #include "runtime/arguments.hpp"
32 PSGCAdaptivePolicyCounters::PSGCAdaptivePolicyCounters(const char* name_arg,
33 int collectors,
34 int generations,
35 PSAdaptiveSizePolicy* size_policy_arg)
36 : GCAdaptivePolicyCounters(name_arg,
37 collectors,
38 generations,
39 size_policy_arg) {
40 if (UsePerfData) {
41 EXCEPTION_MARK;
42 ResourceMark rm;
44 const char* cname;
46 cname = PerfDataManager::counter_name(name_space(), "oldPromoSize");
47 _old_promo_size = PerfDataManager::create_variable(SUN_GC, cname,
48 PerfData::U_Bytes, ps_size_policy()->calculated_promo_size_in_bytes(), CHECK);
50 cname = PerfDataManager::counter_name(name_space(), "oldEdenSize");
51 _old_eden_size = PerfDataManager::create_variable(SUN_GC, cname,
52 PerfData::U_Bytes, ps_size_policy()->calculated_eden_size_in_bytes(), CHECK);
54 cname = PerfDataManager::counter_name(name_space(), "oldCapacity");
55 _old_capacity = PerfDataManager::create_variable(SUN_GC, cname,
56 PerfData::U_Bytes, (jlong) InitialHeapSize, CHECK);
58 cname = PerfDataManager::counter_name(name_space(), "boundaryMoved");
59 _boundary_moved = PerfDataManager::create_variable(SUN_GC, cname,
60 PerfData::U_Bytes, (jlong) 0, CHECK);
62 cname = PerfDataManager::counter_name(name_space(), "avgPromotedAvg");
63 _avg_promoted_avg_counter =
64 PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Bytes,
65 ps_size_policy()->calculated_promo_size_in_bytes(), CHECK);
67 cname = PerfDataManager::counter_name(name_space(), "avgPromotedDev");
68 _avg_promoted_dev_counter =
69 PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Bytes,
70 (jlong) 0 , CHECK);
72 cname = PerfDataManager::counter_name(name_space(), "avgPromotedPaddedAvg");
73 _avg_promoted_padded_avg_counter =
74 PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Bytes,
75 ps_size_policy()->calculated_promo_size_in_bytes(), CHECK);
77 cname = PerfDataManager::counter_name(name_space(),
78 "avgPretenuredPaddedAvg");
79 _avg_pretenured_padded_avg =
80 PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Bytes,
81 (jlong) 0, CHECK);
84 cname = PerfDataManager::counter_name(name_space(),
85 "changeYoungGenForMajPauses");
86 _change_young_gen_for_maj_pauses_counter =
87 PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
88 (jlong)0, CHECK);
90 cname = PerfDataManager::counter_name(name_space(),
91 "changeOldGenForMinPauses");
92 _change_old_gen_for_min_pauses =
93 PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Events,
94 (jlong)0, CHECK);
97 cname = PerfDataManager::counter_name(name_space(), "avgMajorPauseTime");
98 _avg_major_pause = PerfDataManager::create_variable(SUN_GC, cname,
99 PerfData::U_Ticks, (jlong) ps_size_policy()->_avg_major_pause->average(), CHECK);
101 cname = PerfDataManager::counter_name(name_space(), "avgMajorIntervalTime");
102 _avg_major_interval = PerfDataManager::create_variable(SUN_GC, cname,
103 PerfData::U_Ticks, (jlong) ps_size_policy()->_avg_major_interval->average(), CHECK);
105 cname = PerfDataManager::counter_name(name_space(), "majorGcCost");
106 _major_gc_cost_counter = PerfDataManager::create_variable(SUN_GC, cname,
107 PerfData::U_Ticks, (jlong) ps_size_policy()->major_gc_cost(), CHECK);
109 cname = PerfDataManager::counter_name(name_space(), "liveSpace");
110 _live_space = PerfDataManager::create_variable(SUN_GC, cname,
111 PerfData::U_Bytes, ps_size_policy()->live_space(), CHECK);
113 cname = PerfDataManager::counter_name(name_space(), "freeSpace");
114 _free_space = PerfDataManager::create_variable(SUN_GC, cname,
115 PerfData::U_Bytes, ps_size_policy()->free_space(), CHECK);
117 cname = PerfDataManager::counter_name(name_space(), "avgBaseFootprint");
118 _avg_base_footprint = PerfDataManager::create_variable(SUN_GC, cname,
119 PerfData::U_Bytes, (jlong) ps_size_policy()->avg_base_footprint()->average(), CHECK);
121 cname = PerfDataManager::counter_name(name_space(), "gcTimeLimitExceeded");
122 _gc_overhead_limit_exceeded_counter =
123 PerfDataManager::create_variable(SUN_GC, cname,
124 PerfData::U_Events, ps_size_policy()->gc_overhead_limit_exceeded(), CHECK);
126 cname = PerfDataManager::counter_name(name_space(), "liveAtLastFullGc");
127 _live_at_last_full_gc_counter =
128 PerfDataManager::create_variable(SUN_GC, cname,
129 PerfData::U_Bytes, ps_size_policy()->live_at_last_full_gc(), CHECK);
131 cname = PerfDataManager::counter_name(name_space(), "majorPauseOldSlope");
132 _major_pause_old_slope = PerfDataManager::create_variable(SUN_GC, cname,
133 PerfData::U_None, (jlong) 0, CHECK);
135 cname = PerfDataManager::counter_name(name_space(), "minorPauseOldSlope");
136 _minor_pause_old_slope = PerfDataManager::create_variable(SUN_GC, cname,
137 PerfData::U_None, (jlong) 0, CHECK);
139 cname = PerfDataManager::counter_name(name_space(), "majorPauseYoungSlope");
140 _major_pause_young_slope = PerfDataManager::create_variable(SUN_GC, cname,
141 PerfData::U_None, (jlong) 0, CHECK);
143 cname = PerfDataManager::counter_name(name_space(), "scavengeSkipped");
144 _scavenge_skipped = PerfDataManager::create_variable(SUN_GC, cname,
145 PerfData::U_Bytes, (jlong) 0, CHECK);
147 cname = PerfDataManager::counter_name(name_space(), "fullFollowsScavenge");
148 _full_follows_scavenge = PerfDataManager::create_variable(SUN_GC, cname,
149 PerfData::U_Bytes, (jlong) 0, CHECK);
151 _counter_time_stamp.update();
152 }
154 assert(size_policy()->is_gc_ps_adaptive_size_policy(),
155 "Wrong type of size policy");
156 }
158 void PSGCAdaptivePolicyCounters::update_counters_from_policy() {
159 if (UsePerfData) {
160 GCAdaptivePolicyCounters::update_counters_from_policy();
161 update_eden_size();
162 update_promo_size();
163 update_avg_old_live();
164 update_survivor_size_counters();
165 update_avg_promoted_avg();
166 update_avg_promoted_dev();
167 update_avg_promoted_padded_avg();
168 update_avg_pretenured_padded_avg();
170 update_avg_major_pause();
171 update_avg_major_interval();
172 update_minor_gc_cost_counter();
173 update_major_gc_cost_counter();
174 update_mutator_cost_counter();
175 update_decrement_tenuring_threshold_for_gc_cost();
176 update_increment_tenuring_threshold_for_gc_cost();
177 update_decrement_tenuring_threshold_for_survivor_limit();
178 update_live_space();
179 update_free_space();
180 update_avg_base_footprint();
182 update_change_old_gen_for_maj_pauses();
183 update_change_young_gen_for_maj_pauses();
184 update_change_old_gen_for_min_pauses();
186 update_change_old_gen_for_throughput();
187 update_change_young_gen_for_throughput();
189 update_decrease_for_footprint();
190 update_decide_at_full_gc_counter();
192 update_major_pause_old_slope();
193 update_minor_pause_old_slope();
194 update_major_pause_young_slope();
195 update_minor_collection_slope_counter();
196 update_gc_overhead_limit_exceeded_counter();
197 update_live_at_last_full_gc_counter();
198 }
199 }
201 void PSGCAdaptivePolicyCounters::update_counters() {
202 if (UsePerfData) {
203 update_counters_from_policy();
204 }
205 }