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

Sat, 06 Oct 2012 01:17:44 -0700

author
johnc
date
Sat, 06 Oct 2012 01:17:44 -0700
changeset 4173
8a5ea0a9ccc4
parent 4015
bb3f6194fedb
child 4475
7df93f7c14a5
permissions
-rw-r--r--

7127708: G1: change task num types from int to uint in concurrent mark
Summary: Change the type of various task num fields, parameters etc to unsigned and rename them to be more consistent with the other collectors. Code changes were also reviewed by Vitaly Davidovich.
Reviewed-by: johnc
Contributed-by: Kaushik Srenevasan <kaushik@twitter.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