Tue, 31 Mar 2015 11:36:37 +0200
8068036: assert(is_available(index)) failed in G1 cset
Summary: Some verification code iterated over the heap using the region mapping array. This is not allowed. Changed to use the regular iteration method with closure.
Reviewed-by: jwilhelm, brutisso
1 /*
2 * Copyright (c) 2013, 2014 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_G1GCPHASETIMESLOG_HPP
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP
28 #include "memory/allocation.hpp"
30 class LineBuffer;
32 template <class T> class WorkerDataArray;
34 class G1GCPhaseTimes : public CHeapObj<mtGC> {
35 friend class G1GCParPhasePrinter;
37 uint _active_gc_threads;
38 uint _max_gc_threads;
40 public:
41 enum GCParPhases {
42 GCWorkerStart,
43 ExtRootScan,
44 ThreadRoots,
45 StringTableRoots,
46 UniverseRoots,
47 JNIRoots,
48 ObjectSynchronizerRoots,
49 FlatProfilerRoots,
50 ManagementRoots,
51 SystemDictionaryRoots,
52 CLDGRoots,
53 JVMTIRoots,
54 CodeCacheRoots,
55 CMRefRoots,
56 WaitForStrongCLD,
57 WeakCLDRoots,
58 SATBFiltering,
59 UpdateRS,
60 ScanRS,
61 CodeRoots,
62 ObjCopy,
63 Termination,
64 Other,
65 GCWorkerTotal,
66 GCWorkerEnd,
67 StringDedupQueueFixup,
68 StringDedupTableFixup,
69 RedirtyCards,
70 GCParPhasesSentinel
71 };
73 private:
74 // Markers for grouping the phases in the GCPhases enum above
75 static const int GCMainParPhasesLast = GCWorkerEnd;
76 static const int StringDedupPhasesFirst = StringDedupQueueFixup;
77 static const int StringDedupPhasesLast = StringDedupTableFixup;
79 WorkerDataArray<double>* _gc_par_phases[GCParPhasesSentinel];
80 WorkerDataArray<size_t>* _update_rs_processed_buffers;
81 WorkerDataArray<size_t>* _termination_attempts;
82 WorkerDataArray<size_t>* _redirtied_cards;
84 double _cur_collection_par_time_ms;
85 double _cur_collection_code_root_fixup_time_ms;
86 double _cur_strong_code_root_purge_time_ms;
88 double _cur_evac_fail_recalc_used;
89 double _cur_evac_fail_restore_remsets;
90 double _cur_evac_fail_remove_self_forwards;
92 double _cur_string_dedup_fixup_time_ms;
94 double _cur_clear_ct_time_ms;
95 double _cur_ref_proc_time_ms;
96 double _cur_ref_enq_time_ms;
98 double _cur_collection_start_sec;
99 double _root_region_scan_wait_time_ms;
101 double _recorded_young_cset_choice_time_ms;
102 double _recorded_non_young_cset_choice_time_ms;
104 double _recorded_redirty_logged_cards_time_ms;
106 double _recorded_young_free_cset_time_ms;
107 double _recorded_non_young_free_cset_time_ms;
109 double _cur_fast_reclaim_humongous_time_ms;
110 size_t _cur_fast_reclaim_humongous_total;
111 size_t _cur_fast_reclaim_humongous_candidates;
112 size_t _cur_fast_reclaim_humongous_reclaimed;
114 double _cur_verify_before_time_ms;
115 double _cur_verify_after_time_ms;
117 // Helper methods for detailed logging
118 void print_stats(int level, const char* str, double value);
119 void print_stats(int level, const char* str, size_t value);
120 void print_stats(int level, const char* str, double value, uint workers);
122 public:
123 G1GCPhaseTimes(uint max_gc_threads);
124 void note_gc_start(uint active_gc_threads, bool mark_in_progress);
125 void note_gc_end();
126 void print(double pause_time_sec);
128 // record the time a phase took in seconds
129 void record_time_secs(GCParPhases phase, uint worker_i, double secs);
131 // add a number of seconds to a phase
132 void add_time_secs(GCParPhases phase, uint worker_i, double secs);
134 void record_thread_work_item(GCParPhases phase, uint worker_i, size_t count);
136 // return the average time for a phase in milliseconds
137 double average_time_ms(GCParPhases phase);
139 size_t sum_thread_work_items(GCParPhases phase);
141 private:
142 double get_time_ms(GCParPhases phase, uint worker_i);
143 double sum_time_ms(GCParPhases phase);
144 double min_time_ms(GCParPhases phase);
145 double max_time_ms(GCParPhases phase);
146 size_t get_thread_work_item(GCParPhases phase, uint worker_i);
147 double average_thread_work_items(GCParPhases phase);
148 size_t min_thread_work_items(GCParPhases phase);
149 size_t max_thread_work_items(GCParPhases phase);
151 public:
153 void record_clear_ct_time(double ms) {
154 _cur_clear_ct_time_ms = ms;
155 }
157 void record_par_time(double ms) {
158 _cur_collection_par_time_ms = ms;
159 }
161 void record_code_root_fixup_time(double ms) {
162 _cur_collection_code_root_fixup_time_ms = ms;
163 }
165 void record_strong_code_root_purge_time(double ms) {
166 _cur_strong_code_root_purge_time_ms = ms;
167 }
169 void record_evac_fail_recalc_used_time(double ms) {
170 _cur_evac_fail_recalc_used = ms;
171 }
173 void record_evac_fail_restore_remsets(double ms) {
174 _cur_evac_fail_restore_remsets = ms;
175 }
177 void record_evac_fail_remove_self_forwards(double ms) {
178 _cur_evac_fail_remove_self_forwards = ms;
179 }
181 void record_string_dedup_fixup_time(double ms) {
182 _cur_string_dedup_fixup_time_ms = ms;
183 }
185 void record_ref_proc_time(double ms) {
186 _cur_ref_proc_time_ms = ms;
187 }
189 void record_ref_enq_time(double ms) {
190 _cur_ref_enq_time_ms = ms;
191 }
193 void record_root_region_scan_wait_time(double time_ms) {
194 _root_region_scan_wait_time_ms = time_ms;
195 }
197 void record_young_free_cset_time_ms(double time_ms) {
198 _recorded_young_free_cset_time_ms = time_ms;
199 }
201 void record_non_young_free_cset_time_ms(double time_ms) {
202 _recorded_non_young_free_cset_time_ms = time_ms;
203 }
205 void record_fast_reclaim_humongous_stats(size_t total, size_t candidates) {
206 _cur_fast_reclaim_humongous_total = total;
207 _cur_fast_reclaim_humongous_candidates = candidates;
208 }
210 void record_fast_reclaim_humongous_time_ms(double value, size_t reclaimed) {
211 _cur_fast_reclaim_humongous_time_ms = value;
212 _cur_fast_reclaim_humongous_reclaimed = reclaimed;
213 }
215 void record_young_cset_choice_time_ms(double time_ms) {
216 _recorded_young_cset_choice_time_ms = time_ms;
217 }
219 void record_non_young_cset_choice_time_ms(double time_ms) {
220 _recorded_non_young_cset_choice_time_ms = time_ms;
221 }
223 void record_redirty_logged_cards_time_ms(double time_ms) {
224 _recorded_redirty_logged_cards_time_ms = time_ms;
225 }
227 void record_cur_collection_start_sec(double time_ms) {
228 _cur_collection_start_sec = time_ms;
229 }
231 void record_verify_before_time_ms(double time_ms) {
232 _cur_verify_before_time_ms = time_ms;
233 }
235 void record_verify_after_time_ms(double time_ms) {
236 _cur_verify_after_time_ms = time_ms;
237 }
239 double accounted_time_ms();
241 double cur_collection_start_sec() {
242 return _cur_collection_start_sec;
243 }
245 double cur_collection_par_time_ms() {
246 return _cur_collection_par_time_ms;
247 }
249 double cur_clear_ct_time_ms() {
250 return _cur_clear_ct_time_ms;
251 }
253 double root_region_scan_wait_time_ms() {
254 return _root_region_scan_wait_time_ms;
255 }
257 double young_cset_choice_time_ms() {
258 return _recorded_young_cset_choice_time_ms;
259 }
261 double young_free_cset_time_ms() {
262 return _recorded_young_free_cset_time_ms;
263 }
265 double non_young_cset_choice_time_ms() {
266 return _recorded_non_young_cset_choice_time_ms;
267 }
269 double non_young_free_cset_time_ms() {
270 return _recorded_non_young_free_cset_time_ms;
271 }
273 double fast_reclaim_humongous_time_ms() {
274 return _cur_fast_reclaim_humongous_time_ms;
275 }
276 };
278 class G1GCParPhaseTimesTracker : public StackObj {
279 double _start_time;
280 G1GCPhaseTimes::GCParPhases _phase;
281 G1GCPhaseTimes* _phase_times;
282 uint _worker_id;
283 public:
284 G1GCParPhaseTimesTracker(G1GCPhaseTimes* phase_times, G1GCPhaseTimes::GCParPhases phase, uint worker_id);
285 ~G1GCParPhaseTimesTracker();
286 };
288 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP