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

Tue, 26 Aug 2014 09:36:53 +0200

author
tschatzl
date
Tue, 26 Aug 2014 09:36:53 +0200
changeset 7091
a8ea2f110d87
parent 7010
a3953c777565
child 7208
7baf47cb97cb
permissions
-rw-r--r--

8054819: Rename HeapRegionSeq to HeapRegionManager
Reviewed-by: jwilhelm, jmasa

brutisso@3923 1 /*
tschatzl@6402 2 * Copyright (c) 2013, 2014 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@4475 38 NOT_PRODUCT(static const T _uninitialized;)
brutisso@4475 39
brutisso@4015 40 // We are caching the sum and average to only have to calculate them once.
sla@5237 41 // This is not done in an MT-safe way. It is intended to allow single
brutisso@4015 42 // threaded code to call sum() and average() multiple times in any order
brutisso@4015 43 // without having to worry about the cost.
brutisso@4015 44 bool _has_new_data;
brutisso@4015 45 T _sum;
brutisso@4015 46 double _average;
brutisso@4015 47
brutisso@4015 48 public:
brutisso@4015 49 WorkerDataArray(uint length, const char* print_format, bool print_sum = true) :
brutisso@4015 50 _length(length), _print_format(print_format), _print_sum(print_sum), _has_new_data(true) {
brutisso@4015 51 assert(length > 0, "Must have some workers to store data for");
brutisso@4015 52 _data = NEW_C_HEAP_ARRAY(T, _length, mtGC);
brutisso@4015 53 }
brutisso@4015 54
brutisso@4015 55 ~WorkerDataArray() {
brutisso@4015 56 FREE_C_HEAP_ARRAY(T, _data, mtGC);
brutisso@4015 57 }
brutisso@4015 58
brutisso@4015 59 void set(uint worker_i, T value) {
brutisso@4015 60 assert(worker_i < _length, err_msg("Worker %d is greater than max: %d", worker_i, _length));
brutisso@4015 61 assert(_data[worker_i] == (T)-1, err_msg("Overwriting data for worker %d", worker_i));
brutisso@4015 62 _data[worker_i] = value;
brutisso@4015 63 _has_new_data = true;
brutisso@4015 64 }
brutisso@4015 65
brutisso@4015 66 T get(uint worker_i) {
brutisso@4015 67 assert(worker_i < _length, err_msg("Worker %d is greater than max: %d", worker_i, _length));
brutisso@4015 68 assert(_data[worker_i] != (T)-1, err_msg("No data to add to for worker %d", worker_i));
brutisso@4015 69 return _data[worker_i];
brutisso@4015 70 }
brutisso@4015 71
brutisso@4015 72 void add(uint worker_i, T value) {
brutisso@4015 73 assert(worker_i < _length, err_msg("Worker %d is greater than max: %d", worker_i, _length));
brutisso@4015 74 assert(_data[worker_i] != (T)-1, err_msg("No data to add to for worker %d", worker_i));
brutisso@4015 75 _data[worker_i] += value;
brutisso@4015 76 _has_new_data = true;
brutisso@4015 77 }
brutisso@4015 78
brutisso@4015 79 double average(){
brutisso@4015 80 if (_has_new_data) {
brutisso@4015 81 calculate_totals();
brutisso@4015 82 }
brutisso@4015 83 return _average;
brutisso@4015 84 }
brutisso@4015 85
brutisso@4015 86 T sum() {
brutisso@4015 87 if (_has_new_data) {
brutisso@4015 88 calculate_totals();
brutisso@4015 89 }
brutisso@4015 90 return _sum;
brutisso@4015 91 }
brutisso@4015 92
brutisso@4015 93 void print(int level, const char* title);
brutisso@4015 94
brutisso@4015 95 void reset() PRODUCT_RETURN;
brutisso@4015 96 void verify() PRODUCT_RETURN;
brutisso@4015 97
brutisso@4015 98 private:
brutisso@4015 99
brutisso@4015 100 void calculate_totals(){
brutisso@4015 101 _sum = (T)0;
brutisso@4015 102 for (uint i = 0; i < _length; ++i) {
brutisso@4015 103 _sum += _data[i];
brutisso@4015 104 }
brutisso@4015 105 _average = (double)_sum / (double)_length;
brutisso@4015 106 _has_new_data = false;
brutisso@4015 107 }
brutisso@4015 108 };
brutisso@4015 109
jmasa@3924 110 class G1GCPhaseTimes : public CHeapObj<mtGC> {
brutisso@3923 111
brutisso@3923 112 private:
brutisso@3923 113 uint _active_gc_threads;
brutisso@3923 114 uint _max_gc_threads;
brutisso@3923 115
brutisso@4015 116 WorkerDataArray<double> _last_gc_worker_start_times_ms;
brutisso@4015 117 WorkerDataArray<double> _last_ext_root_scan_times_ms;
brutisso@4015 118 WorkerDataArray<double> _last_satb_filtering_times_ms;
brutisso@4015 119 WorkerDataArray<double> _last_update_rs_times_ms;
brutisso@4015 120 WorkerDataArray<int> _last_update_rs_processed_buffers;
brutisso@4015 121 WorkerDataArray<double> _last_scan_rs_times_ms;
johnc@5548 122 WorkerDataArray<double> _last_strong_code_root_scan_times_ms;
brutisso@4015 123 WorkerDataArray<double> _last_obj_copy_times_ms;
brutisso@4015 124 WorkerDataArray<double> _last_termination_times_ms;
brutisso@4015 125 WorkerDataArray<size_t> _last_termination_attempts;
brutisso@4015 126 WorkerDataArray<double> _last_gc_worker_end_times_ms;
brutisso@4015 127 WorkerDataArray<double> _last_gc_worker_times_ms;
brutisso@4015 128 WorkerDataArray<double> _last_gc_worker_other_times_ms;
brutisso@3923 129
brutisso@3923 130 double _cur_collection_par_time_ms;
brutisso@3923 131 double _cur_collection_code_root_fixup_time_ms;
johnc@5548 132 double _cur_strong_code_root_migration_time_ms;
tschatzl@6402 133 double _cur_strong_code_root_purge_time_ms;
brutisso@3923 134
tschatzl@6406 135 double _cur_evac_fail_recalc_used;
tschatzl@6406 136 double _cur_evac_fail_restore_remsets;
tschatzl@6406 137 double _cur_evac_fail_remove_self_forwards;
tschatzl@6406 138
pliden@6413 139 double _cur_string_dedup_fixup_time_ms;
pliden@6413 140 WorkerDataArray<double> _cur_string_dedup_queue_fixup_worker_times_ms;
pliden@6413 141 WorkerDataArray<double> _cur_string_dedup_table_fixup_worker_times_ms;
pliden@6413 142
brutisso@3923 143 double _cur_clear_ct_time_ms;
brutisso@3923 144 double _cur_ref_proc_time_ms;
brutisso@3923 145 double _cur_ref_enq_time_ms;
brutisso@3923 146
brutisso@3923 147 double _cur_collection_start_sec;
brutisso@3923 148 double _root_region_scan_wait_time_ms;
brutisso@3923 149
brutisso@3923 150 double _recorded_young_cset_choice_time_ms;
brutisso@3923 151 double _recorded_non_young_cset_choice_time_ms;
brutisso@3923 152
tschatzl@6930 153 WorkerDataArray<double> _last_redirty_logged_cards_time_ms;
tschatzl@6930 154 WorkerDataArray<size_t> _last_redirty_logged_cards_processed_cards;
tschatzl@6405 155 double _recorded_redirty_logged_cards_time_ms;
tschatzl@6405 156
brutisso@3923 157 double _recorded_young_free_cset_time_ms;
brutisso@3923 158 double _recorded_non_young_free_cset_time_ms;
brutisso@3923 159
tschatzl@7010 160 double _cur_fast_reclaim_humongous_time_ms;
tschatzl@7010 161 size_t _cur_fast_reclaim_humongous_total;
tschatzl@7010 162 size_t _cur_fast_reclaim_humongous_candidates;
tschatzl@7010 163 size_t _cur_fast_reclaim_humongous_reclaimed;
tschatzl@7010 164
brutisso@4015 165 double _cur_verify_before_time_ms;
brutisso@4015 166 double _cur_verify_after_time_ms;
brutisso@4015 167
brutisso@4015 168 // Helper methods for detailed logging
brutisso@4015 169 void print_stats(int level, const char* str, double value);
tschatzl@7010 170 void print_stats(int level, const char* str, size_t value);
vkempik@6552 171 void print_stats(int level, const char* str, double value, uint workers);
brutisso@3923 172
brutisso@3923 173 public:
brutisso@3923 174 G1GCPhaseTimes(uint max_gc_threads);
brutisso@4015 175 void note_gc_start(uint active_gc_threads);
brutisso@4015 176 void note_gc_end();
brutisso@4015 177 void print(double pause_time_sec);
brutisso@3923 178
brutisso@3923 179 void record_gc_worker_start_time(uint worker_i, double ms) {
brutisso@4015 180 _last_gc_worker_start_times_ms.set(worker_i, ms);
brutisso@3923 181 }
brutisso@3923 182
brutisso@3923 183 void record_ext_root_scan_time(uint worker_i, double ms) {
brutisso@4015 184 _last_ext_root_scan_times_ms.set(worker_i, ms);
brutisso@3923 185 }
brutisso@3923 186
brutisso@3923 187 void record_satb_filtering_time(uint worker_i, double ms) {
brutisso@4015 188 _last_satb_filtering_times_ms.set(worker_i, ms);
brutisso@3923 189 }
brutisso@3923 190
brutisso@3923 191 void record_update_rs_time(uint worker_i, double ms) {
brutisso@4015 192 _last_update_rs_times_ms.set(worker_i, ms);
brutisso@3923 193 }
brutisso@3923 194
brutisso@4015 195 void record_update_rs_processed_buffers(uint worker_i, int processed_buffers) {
brutisso@4015 196 _last_update_rs_processed_buffers.set(worker_i, processed_buffers);
brutisso@3923 197 }
brutisso@3923 198
brutisso@3923 199 void record_scan_rs_time(uint worker_i, double ms) {
brutisso@4015 200 _last_scan_rs_times_ms.set(worker_i, ms);
brutisso@3923 201 }
brutisso@3923 202
johnc@5548 203 void record_strong_code_root_scan_time(uint worker_i, double ms) {
johnc@5548 204 _last_strong_code_root_scan_times_ms.set(worker_i, ms);
johnc@5548 205 }
johnc@5548 206
brutisso@3923 207 void record_obj_copy_time(uint worker_i, double ms) {
brutisso@4015 208 _last_obj_copy_times_ms.set(worker_i, ms);
brutisso@4015 209 }
brutisso@4015 210
brutisso@4015 211 void add_obj_copy_time(uint worker_i, double ms) {
brutisso@4015 212 _last_obj_copy_times_ms.add(worker_i, ms);
brutisso@3923 213 }
brutisso@3923 214
brutisso@3923 215 void record_termination(uint worker_i, double ms, size_t attempts) {
brutisso@4015 216 _last_termination_times_ms.set(worker_i, ms);
brutisso@4015 217 _last_termination_attempts.set(worker_i, attempts);
brutisso@3923 218 }
brutisso@3923 219
brutisso@3923 220 void record_gc_worker_end_time(uint worker_i, double ms) {
brutisso@4015 221 _last_gc_worker_end_times_ms.set(worker_i, ms);
brutisso@3923 222 }
brutisso@3923 223
brutisso@3923 224 void record_clear_ct_time(double ms) {
brutisso@3923 225 _cur_clear_ct_time_ms = ms;
brutisso@3923 226 }
brutisso@3923 227
brutisso@3923 228 void record_par_time(double ms) {
brutisso@3923 229 _cur_collection_par_time_ms = ms;
brutisso@3923 230 }
brutisso@3923 231
brutisso@3923 232 void record_code_root_fixup_time(double ms) {
brutisso@3923 233 _cur_collection_code_root_fixup_time_ms = ms;
brutisso@3923 234 }
brutisso@3923 235
johnc@5548 236 void record_strong_code_root_migration_time(double ms) {
johnc@5548 237 _cur_strong_code_root_migration_time_ms = ms;
johnc@5548 238 }
johnc@5548 239
tschatzl@6402 240 void record_strong_code_root_purge_time(double ms) {
tschatzl@6402 241 _cur_strong_code_root_purge_time_ms = ms;
tschatzl@6402 242 }
tschatzl@6402 243
tschatzl@6406 244 void record_evac_fail_recalc_used_time(double ms) {
tschatzl@6406 245 _cur_evac_fail_recalc_used = ms;
tschatzl@6406 246 }
tschatzl@6406 247
tschatzl@6406 248 void record_evac_fail_restore_remsets(double ms) {
tschatzl@6406 249 _cur_evac_fail_restore_remsets = ms;
tschatzl@6406 250 }
tschatzl@6406 251
tschatzl@6406 252 void record_evac_fail_remove_self_forwards(double ms) {
tschatzl@6406 253 _cur_evac_fail_remove_self_forwards = ms;
tschatzl@6406 254 }
tschatzl@6406 255
pliden@6413 256 void note_string_dedup_fixup_start();
pliden@6413 257 void note_string_dedup_fixup_end();
pliden@6413 258
pliden@6413 259 void record_string_dedup_fixup_time(double ms) {
pliden@6413 260 _cur_string_dedup_fixup_time_ms = ms;
pliden@6413 261 }
pliden@6413 262
pliden@6413 263 void record_string_dedup_queue_fixup_worker_time(uint worker_id, double ms) {
pliden@6413 264 _cur_string_dedup_queue_fixup_worker_times_ms.set(worker_id, ms);
pliden@6413 265 }
pliden@6413 266
pliden@6413 267 void record_string_dedup_table_fixup_worker_time(uint worker_id, double ms) {
pliden@6413 268 _cur_string_dedup_table_fixup_worker_times_ms.set(worker_id, ms);
pliden@6413 269 }
pliden@6413 270
brutisso@3923 271 void record_ref_proc_time(double ms) {
brutisso@3923 272 _cur_ref_proc_time_ms = ms;
brutisso@3923 273 }
brutisso@3923 274
brutisso@3923 275 void record_ref_enq_time(double ms) {
brutisso@3923 276 _cur_ref_enq_time_ms = ms;
brutisso@3923 277 }
brutisso@3923 278
brutisso@3923 279 void record_root_region_scan_wait_time(double time_ms) {
brutisso@3923 280 _root_region_scan_wait_time_ms = time_ms;
brutisso@3923 281 }
brutisso@3923 282
brutisso@3923 283 void record_young_free_cset_time_ms(double time_ms) {
brutisso@3923 284 _recorded_young_free_cset_time_ms = time_ms;
brutisso@3923 285 }
brutisso@3923 286
brutisso@3923 287 void record_non_young_free_cset_time_ms(double time_ms) {
brutisso@3923 288 _recorded_non_young_free_cset_time_ms = time_ms;
brutisso@3923 289 }
brutisso@4015 290
tschatzl@7010 291 void record_fast_reclaim_humongous_stats(size_t total, size_t candidates) {
tschatzl@7010 292 _cur_fast_reclaim_humongous_total = total;
tschatzl@7010 293 _cur_fast_reclaim_humongous_candidates = candidates;
tschatzl@7010 294 }
tschatzl@7010 295
tschatzl@7010 296 void record_fast_reclaim_humongous_time_ms(double value, size_t reclaimed) {
tschatzl@7010 297 _cur_fast_reclaim_humongous_time_ms = value;
tschatzl@7010 298 _cur_fast_reclaim_humongous_reclaimed = reclaimed;
tschatzl@7010 299 }
tschatzl@7010 300
brutisso@4015 301 void record_young_cset_choice_time_ms(double time_ms) {
brutisso@4015 302 _recorded_young_cset_choice_time_ms = time_ms;
brutisso@4015 303 }
brutisso@4015 304
brutisso@4015 305 void record_non_young_cset_choice_time_ms(double time_ms) {
brutisso@4015 306 _recorded_non_young_cset_choice_time_ms = time_ms;
brutisso@4015 307 }
brutisso@4015 308
tschatzl@6930 309 void record_redirty_logged_cards_time_ms(uint worker_i, double time_ms) {
tschatzl@6930 310 _last_redirty_logged_cards_time_ms.set(worker_i, time_ms);
tschatzl@6930 311 }
tschatzl@6930 312
tschatzl@6930 313 void record_redirty_logged_cards_processed_cards(uint worker_i, size_t processed_buffers) {
tschatzl@6930 314 _last_redirty_logged_cards_processed_cards.set(worker_i, processed_buffers);
tschatzl@6930 315 }
tschatzl@6930 316
tschatzl@6405 317 void record_redirty_logged_cards_time_ms(double time_ms) {
tschatzl@6405 318 _recorded_redirty_logged_cards_time_ms = time_ms;
tschatzl@6405 319 }
tschatzl@6405 320
brutisso@4015 321 void record_cur_collection_start_sec(double time_ms) {
brutisso@4015 322 _cur_collection_start_sec = time_ms;
brutisso@4015 323 }
brutisso@4015 324
brutisso@4015 325 void record_verify_before_time_ms(double time_ms) {
brutisso@4015 326 _cur_verify_before_time_ms = time_ms;
brutisso@4015 327 }
brutisso@4015 328
brutisso@4015 329 void record_verify_after_time_ms(double time_ms) {
brutisso@4015 330 _cur_verify_after_time_ms = time_ms;
brutisso@4015 331 }
brutisso@4015 332
brutisso@4015 333 double accounted_time_ms();
brutisso@4015 334
brutisso@4015 335 double cur_collection_start_sec() {
brutisso@4015 336 return _cur_collection_start_sec;
brutisso@4015 337 }
brutisso@4015 338
brutisso@4015 339 double cur_collection_par_time_ms() {
brutisso@4015 340 return _cur_collection_par_time_ms;
brutisso@4015 341 }
brutisso@4015 342
brutisso@4015 343 double cur_clear_ct_time_ms() {
brutisso@4015 344 return _cur_clear_ct_time_ms;
brutisso@4015 345 }
brutisso@4015 346
brutisso@4015 347 double root_region_scan_wait_time_ms() {
brutisso@4015 348 return _root_region_scan_wait_time_ms;
brutisso@4015 349 }
brutisso@4015 350
brutisso@4015 351 double young_cset_choice_time_ms() {
brutisso@4015 352 return _recorded_young_cset_choice_time_ms;
brutisso@4015 353 }
brutisso@4015 354
brutisso@4015 355 double young_free_cset_time_ms() {
brutisso@4015 356 return _recorded_young_free_cset_time_ms;
brutisso@4015 357 }
brutisso@4015 358
brutisso@4015 359 double non_young_cset_choice_time_ms() {
brutisso@4015 360 return _recorded_non_young_cset_choice_time_ms;
brutisso@4015 361 }
brutisso@4015 362
brutisso@4015 363 double non_young_free_cset_time_ms() {
brutisso@4015 364 return _recorded_non_young_free_cset_time_ms;
brutisso@4015 365 }
brutisso@4015 366
tschatzl@7010 367 double fast_reclaim_humongous_time_ms() {
tschatzl@7010 368 return _cur_fast_reclaim_humongous_time_ms;
tschatzl@7010 369 }
tschatzl@7010 370
brutisso@4015 371 double average_last_update_rs_time() {
brutisso@4015 372 return _last_update_rs_times_ms.average();
brutisso@4015 373 }
brutisso@4015 374
brutisso@4015 375 int sum_last_update_rs_processed_buffers() {
brutisso@4015 376 return _last_update_rs_processed_buffers.sum();
brutisso@4015 377 }
brutisso@4015 378
brutisso@4015 379 double average_last_scan_rs_time(){
brutisso@4015 380 return _last_scan_rs_times_ms.average();
brutisso@4015 381 }
brutisso@4015 382
johnc@5548 383 double average_last_strong_code_root_scan_time(){
johnc@5548 384 return _last_strong_code_root_scan_times_ms.average();
johnc@5548 385 }
johnc@5548 386
brutisso@4015 387 double average_last_obj_copy_time() {
brutisso@4015 388 return _last_obj_copy_times_ms.average();
brutisso@4015 389 }
brutisso@4015 390
brutisso@4015 391 double average_last_termination_time() {
brutisso@4015 392 return _last_termination_times_ms.average();
brutisso@4015 393 }
brutisso@4015 394
brutisso@4015 395 double average_last_ext_root_scan_time() {
brutisso@4015 396 return _last_ext_root_scan_times_ms.average();
brutisso@4015 397 }
brutisso@4015 398
brutisso@4015 399 double average_last_satb_filtering_times_ms() {
brutisso@4015 400 return _last_satb_filtering_times_ms.average();
brutisso@4015 401 }
brutisso@3923 402 };
brutisso@3923 403
brutisso@3923 404 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP

mercurial