src/share/vm/gc_implementation/g1/g1GCPhaseTimes.hpp

Wed, 02 Jan 2013 11:32:41 -0800

author
johnc
date
Wed, 02 Jan 2013 11:32:41 -0800
changeset 4384
b735136e0d82
parent 4015
bb3f6194fedb
child 4475
7df93f7c14a5
permissions
-rw-r--r--

8004132: SerialGC: ValidateMarkSweep broken when running GCOld
Summary: Remove bit-rotten ValidateMarkSweep functionality and flag.
Reviewed-by: johnc, jmasa
Contributed-by: tamao <tao.mao@oracle.com>

brutisso@3923 1 /*
brutisso@3923 2 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
brutisso@3923 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
brutisso@3923 4 *
brutisso@3923 5 * This code is free software; you can redistribute it and/or modify it
brutisso@3923 6 * under the terms of the GNU General Public License version 2 only, as
brutisso@3923 7 * published by the Free Software Foundation.
brutisso@3923 8 *
brutisso@3923 9 * This code is distributed in the hope that it will be useful, but WITHOUT
brutisso@3923 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
brutisso@3923 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
brutisso@3923 12 * version 2 for more details (a copy is included in the LICENSE file that
brutisso@3923 13 * accompanied this code).
brutisso@3923 14 *
brutisso@3923 15 * You should have received a copy of the GNU General Public License version
brutisso@3923 16 * 2 along with this work; if not, write to the Free Software Foundation,
brutisso@3923 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
brutisso@3923 18 *
brutisso@3923 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
brutisso@3923 20 * or visit www.oracle.com if you need additional information or have any
brutisso@3923 21 * questions.
brutisso@3923 22 *
brutisso@3923 23 */
brutisso@3923 24
brutisso@3923 25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP
brutisso@3923 26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP
brutisso@3923 27
brutisso@3923 28 #include "memory/allocation.hpp"
brutisso@3923 29 #include "gc_interface/gcCause.hpp"
brutisso@3923 30
brutisso@4015 31 template <class T>
brutisso@4015 32 class WorkerDataArray : public CHeapObj<mtGC> {
brutisso@4015 33 T* _data;
brutisso@4015 34 uint _length;
brutisso@4015 35 const char* _print_format;
brutisso@4015 36 bool _print_sum;
brutisso@4015 37
brutisso@4015 38 // We are caching the sum and average to only have to calculate them once.
brutisso@4015 39 // This is not done in an MT-safe way. It is intetened to allow single
brutisso@4015 40 // threaded code to call sum() and average() multiple times in any order
brutisso@4015 41 // without having to worry about the cost.
brutisso@4015 42 bool _has_new_data;
brutisso@4015 43 T _sum;
brutisso@4015 44 double _average;
brutisso@4015 45
brutisso@4015 46 public:
brutisso@4015 47 WorkerDataArray(uint length, const char* print_format, bool print_sum = true) :
brutisso@4015 48 _length(length), _print_format(print_format), _print_sum(print_sum), _has_new_data(true) {
brutisso@4015 49 assert(length > 0, "Must have some workers to store data for");
brutisso@4015 50 _data = NEW_C_HEAP_ARRAY(T, _length, mtGC);
brutisso@4015 51 }
brutisso@4015 52
brutisso@4015 53 ~WorkerDataArray() {
brutisso@4015 54 FREE_C_HEAP_ARRAY(T, _data, mtGC);
brutisso@4015 55 }
brutisso@4015 56
brutisso@4015 57 void set(uint worker_i, T value) {
brutisso@4015 58 assert(worker_i < _length, err_msg("Worker %d is greater than max: %d", worker_i, _length));
brutisso@4015 59 assert(_data[worker_i] == (T)-1, err_msg("Overwriting data for worker %d", worker_i));
brutisso@4015 60 _data[worker_i] = value;
brutisso@4015 61 _has_new_data = true;
brutisso@4015 62 }
brutisso@4015 63
brutisso@4015 64 T get(uint worker_i) {
brutisso@4015 65 assert(worker_i < _length, err_msg("Worker %d is greater than max: %d", worker_i, _length));
brutisso@4015 66 assert(_data[worker_i] != (T)-1, err_msg("No data to add to for worker %d", worker_i));
brutisso@4015 67 return _data[worker_i];
brutisso@4015 68 }
brutisso@4015 69
brutisso@4015 70 void add(uint worker_i, T value) {
brutisso@4015 71 assert(worker_i < _length, err_msg("Worker %d is greater than max: %d", worker_i, _length));
brutisso@4015 72 assert(_data[worker_i] != (T)-1, err_msg("No data to add to for worker %d", worker_i));
brutisso@4015 73 _data[worker_i] += value;
brutisso@4015 74 _has_new_data = true;
brutisso@4015 75 }
brutisso@4015 76
brutisso@4015 77 double average(){
brutisso@4015 78 if (_has_new_data) {
brutisso@4015 79 calculate_totals();
brutisso@4015 80 }
brutisso@4015 81 return _average;
brutisso@4015 82 }
brutisso@4015 83
brutisso@4015 84 T sum() {
brutisso@4015 85 if (_has_new_data) {
brutisso@4015 86 calculate_totals();
brutisso@4015 87 }
brutisso@4015 88 return _sum;
brutisso@4015 89 }
brutisso@4015 90
brutisso@4015 91 void print(int level, const char* title);
brutisso@4015 92
brutisso@4015 93 void reset() PRODUCT_RETURN;
brutisso@4015 94 void verify() PRODUCT_RETURN;
brutisso@4015 95
brutisso@4015 96 private:
brutisso@4015 97
brutisso@4015 98 void calculate_totals(){
brutisso@4015 99 _sum = (T)0;
brutisso@4015 100 for (uint i = 0; i < _length; ++i) {
brutisso@4015 101 _sum += _data[i];
brutisso@4015 102 }
brutisso@4015 103 _average = (double)_sum / (double)_length;
brutisso@4015 104 _has_new_data = false;
brutisso@4015 105 }
brutisso@4015 106 };
brutisso@4015 107
jmasa@3924 108 class G1GCPhaseTimes : public CHeapObj<mtGC> {
brutisso@3923 109
brutisso@3923 110 private:
brutisso@3923 111 uint _active_gc_threads;
brutisso@3923 112 uint _max_gc_threads;
brutisso@3923 113
brutisso@4015 114 WorkerDataArray<double> _last_gc_worker_start_times_ms;
brutisso@4015 115 WorkerDataArray<double> _last_ext_root_scan_times_ms;
brutisso@4015 116 WorkerDataArray<double> _last_satb_filtering_times_ms;
brutisso@4015 117 WorkerDataArray<double> _last_update_rs_times_ms;
brutisso@4015 118 WorkerDataArray<int> _last_update_rs_processed_buffers;
brutisso@4015 119 WorkerDataArray<double> _last_scan_rs_times_ms;
brutisso@4015 120 WorkerDataArray<double> _last_obj_copy_times_ms;
brutisso@4015 121 WorkerDataArray<double> _last_termination_times_ms;
brutisso@4015 122 WorkerDataArray<size_t> _last_termination_attempts;
brutisso@4015 123 WorkerDataArray<double> _last_gc_worker_end_times_ms;
brutisso@4015 124 WorkerDataArray<double> _last_gc_worker_times_ms;
brutisso@4015 125 WorkerDataArray<double> _last_gc_worker_other_times_ms;
brutisso@3923 126
brutisso@3923 127 double _cur_collection_par_time_ms;
brutisso@3923 128 double _cur_collection_code_root_fixup_time_ms;
brutisso@3923 129
brutisso@3923 130 double _cur_clear_ct_time_ms;
brutisso@3923 131 double _cur_ref_proc_time_ms;
brutisso@3923 132 double _cur_ref_enq_time_ms;
brutisso@3923 133
brutisso@3923 134 // Card Table Count Cache stats
brutisso@3923 135 double _min_clear_cc_time_ms; // min
brutisso@3923 136 double _max_clear_cc_time_ms; // max
brutisso@3923 137 double _cur_clear_cc_time_ms; // clearing time during current pause
brutisso@3923 138 double _cum_clear_cc_time_ms; // cummulative clearing time
brutisso@3923 139 jlong _num_cc_clears; // number of times the card count cache has been cleared
brutisso@3923 140
brutisso@3923 141 double _cur_collection_start_sec;
brutisso@3923 142 double _root_region_scan_wait_time_ms;
brutisso@3923 143
brutisso@3923 144 double _recorded_young_cset_choice_time_ms;
brutisso@3923 145 double _recorded_non_young_cset_choice_time_ms;
brutisso@3923 146
brutisso@3923 147 double _recorded_young_free_cset_time_ms;
brutisso@3923 148 double _recorded_non_young_free_cset_time_ms;
brutisso@3923 149
brutisso@4015 150 double _cur_verify_before_time_ms;
brutisso@4015 151 double _cur_verify_after_time_ms;
brutisso@4015 152
brutisso@4015 153 // Helper methods for detailed logging
brutisso@4015 154 void print_stats(int level, const char* str, double value);
brutisso@4015 155 void print_stats(int level, const char* str, double value, int workers);
brutisso@3923 156
brutisso@3923 157 public:
brutisso@3923 158 G1GCPhaseTimes(uint max_gc_threads);
brutisso@4015 159 void note_gc_start(uint active_gc_threads);
brutisso@4015 160 void note_gc_end();
brutisso@4015 161 void print(double pause_time_sec);
brutisso@3923 162
brutisso@3923 163 void record_gc_worker_start_time(uint worker_i, double ms) {
brutisso@4015 164 _last_gc_worker_start_times_ms.set(worker_i, ms);
brutisso@3923 165 }
brutisso@3923 166
brutisso@3923 167 void record_ext_root_scan_time(uint worker_i, double ms) {
brutisso@4015 168 _last_ext_root_scan_times_ms.set(worker_i, ms);
brutisso@3923 169 }
brutisso@3923 170
brutisso@3923 171 void record_satb_filtering_time(uint worker_i, double ms) {
brutisso@4015 172 _last_satb_filtering_times_ms.set(worker_i, ms);
brutisso@3923 173 }
brutisso@3923 174
brutisso@3923 175 void record_update_rs_time(uint worker_i, double ms) {
brutisso@4015 176 _last_update_rs_times_ms.set(worker_i, ms);
brutisso@3923 177 }
brutisso@3923 178
brutisso@4015 179 void record_update_rs_processed_buffers(uint worker_i, int processed_buffers) {
brutisso@4015 180 _last_update_rs_processed_buffers.set(worker_i, processed_buffers);
brutisso@3923 181 }
brutisso@3923 182
brutisso@3923 183 void record_scan_rs_time(uint worker_i, double ms) {
brutisso@4015 184 _last_scan_rs_times_ms.set(worker_i, ms);
brutisso@3923 185 }
brutisso@3923 186
brutisso@3923 187 void record_obj_copy_time(uint worker_i, double ms) {
brutisso@4015 188 _last_obj_copy_times_ms.set(worker_i, ms);
brutisso@4015 189 }
brutisso@4015 190
brutisso@4015 191 void add_obj_copy_time(uint worker_i, double ms) {
brutisso@4015 192 _last_obj_copy_times_ms.add(worker_i, ms);
brutisso@3923 193 }
brutisso@3923 194
brutisso@3923 195 void record_termination(uint worker_i, double ms, size_t attempts) {
brutisso@4015 196 _last_termination_times_ms.set(worker_i, ms);
brutisso@4015 197 _last_termination_attempts.set(worker_i, attempts);
brutisso@3923 198 }
brutisso@3923 199
brutisso@3923 200 void record_gc_worker_end_time(uint worker_i, double ms) {
brutisso@4015 201 _last_gc_worker_end_times_ms.set(worker_i, ms);
brutisso@3923 202 }
brutisso@3923 203
brutisso@3923 204 void record_clear_ct_time(double ms) {
brutisso@3923 205 _cur_clear_ct_time_ms = ms;
brutisso@3923 206 }
brutisso@3923 207
brutisso@3923 208 void record_par_time(double ms) {
brutisso@3923 209 _cur_collection_par_time_ms = ms;
brutisso@3923 210 }
brutisso@3923 211
brutisso@3923 212 void record_code_root_fixup_time(double ms) {
brutisso@3923 213 _cur_collection_code_root_fixup_time_ms = ms;
brutisso@3923 214 }
brutisso@3923 215
brutisso@3923 216 void record_ref_proc_time(double ms) {
brutisso@3923 217 _cur_ref_proc_time_ms = ms;
brutisso@3923 218 }
brutisso@3923 219
brutisso@3923 220 void record_ref_enq_time(double ms) {
brutisso@3923 221 _cur_ref_enq_time_ms = ms;
brutisso@3923 222 }
brutisso@3923 223
brutisso@3923 224 void record_root_region_scan_wait_time(double time_ms) {
brutisso@3923 225 _root_region_scan_wait_time_ms = time_ms;
brutisso@3923 226 }
brutisso@3923 227
brutisso@3923 228 void record_cc_clear_time_ms(double ms);
brutisso@3923 229
brutisso@3923 230 void record_young_free_cset_time_ms(double time_ms) {
brutisso@3923 231 _recorded_young_free_cset_time_ms = time_ms;
brutisso@3923 232 }
brutisso@3923 233
brutisso@3923 234 void record_non_young_free_cset_time_ms(double time_ms) {
brutisso@3923 235 _recorded_non_young_free_cset_time_ms = time_ms;
brutisso@3923 236 }
brutisso@4015 237
brutisso@4015 238 void record_young_cset_choice_time_ms(double time_ms) {
brutisso@4015 239 _recorded_young_cset_choice_time_ms = time_ms;
brutisso@4015 240 }
brutisso@4015 241
brutisso@4015 242 void record_non_young_cset_choice_time_ms(double time_ms) {
brutisso@4015 243 _recorded_non_young_cset_choice_time_ms = time_ms;
brutisso@4015 244 }
brutisso@4015 245
brutisso@4015 246 void record_cur_collection_start_sec(double time_ms) {
brutisso@4015 247 _cur_collection_start_sec = time_ms;
brutisso@4015 248 }
brutisso@4015 249
brutisso@4015 250 void record_verify_before_time_ms(double time_ms) {
brutisso@4015 251 _cur_verify_before_time_ms = time_ms;
brutisso@4015 252 }
brutisso@4015 253
brutisso@4015 254 void record_verify_after_time_ms(double time_ms) {
brutisso@4015 255 _cur_verify_after_time_ms = time_ms;
brutisso@4015 256 }
brutisso@4015 257
brutisso@4015 258 double accounted_time_ms();
brutisso@4015 259
brutisso@4015 260 double cur_collection_start_sec() {
brutisso@4015 261 return _cur_collection_start_sec;
brutisso@4015 262 }
brutisso@4015 263
brutisso@4015 264 double cur_collection_par_time_ms() {
brutisso@4015 265 return _cur_collection_par_time_ms;
brutisso@4015 266 }
brutisso@4015 267
brutisso@4015 268 double cur_clear_ct_time_ms() {
brutisso@4015 269 return _cur_clear_ct_time_ms;
brutisso@4015 270 }
brutisso@4015 271
brutisso@4015 272 double root_region_scan_wait_time_ms() {
brutisso@4015 273 return _root_region_scan_wait_time_ms;
brutisso@4015 274 }
brutisso@4015 275
brutisso@4015 276 double young_cset_choice_time_ms() {
brutisso@4015 277 return _recorded_young_cset_choice_time_ms;
brutisso@4015 278 }
brutisso@4015 279
brutisso@4015 280 double young_free_cset_time_ms() {
brutisso@4015 281 return _recorded_young_free_cset_time_ms;
brutisso@4015 282 }
brutisso@4015 283
brutisso@4015 284 double non_young_cset_choice_time_ms() {
brutisso@4015 285 return _recorded_non_young_cset_choice_time_ms;
brutisso@4015 286 }
brutisso@4015 287
brutisso@4015 288 double non_young_free_cset_time_ms() {
brutisso@4015 289 return _recorded_non_young_free_cset_time_ms;
brutisso@4015 290 }
brutisso@4015 291
brutisso@4015 292 double average_last_update_rs_time() {
brutisso@4015 293 return _last_update_rs_times_ms.average();
brutisso@4015 294 }
brutisso@4015 295
brutisso@4015 296 int sum_last_update_rs_processed_buffers() {
brutisso@4015 297 return _last_update_rs_processed_buffers.sum();
brutisso@4015 298 }
brutisso@4015 299
brutisso@4015 300 double average_last_scan_rs_time(){
brutisso@4015 301 return _last_scan_rs_times_ms.average();
brutisso@4015 302 }
brutisso@4015 303
brutisso@4015 304 double average_last_obj_copy_time() {
brutisso@4015 305 return _last_obj_copy_times_ms.average();
brutisso@4015 306 }
brutisso@4015 307
brutisso@4015 308 double average_last_termination_time() {
brutisso@4015 309 return _last_termination_times_ms.average();
brutisso@4015 310 }
brutisso@4015 311
brutisso@4015 312 double average_last_ext_root_scan_time() {
brutisso@4015 313 return _last_ext_root_scan_times_ms.average();
brutisso@4015 314 }
brutisso@4015 315
brutisso@4015 316 double average_last_satb_filtering_times_ms() {
brutisso@4015 317 return _last_satb_filtering_times_ms.average();
brutisso@4015 318 }
brutisso@3923 319 };
brutisso@3923 320
brutisso@3923 321 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP

mercurial