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

Tue, 21 Aug 2012 14:10:39 -0700

author
johnc
date
Tue, 21 Aug 2012 14:10:39 -0700
changeset 3998
7383557659bd
parent 3924
3a431b605145
child 4015
bb3f6194fedb
permissions
-rw-r--r--

7185699: G1: Prediction model discrepancies
Summary: Correct the result value of G1CollectedHeap::pending_card_num(). Change the code that calculates the GC efficiency of a non-young heap region to use historical data from mixed GCs and the actual number of live bytes when predicting how long it would take to collect the region. Changes were also reviewed by Thomas Schatzl.
Reviewed-by: azeemj, brutisso

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
jmasa@3924 31 class G1GCPhaseTimes : public CHeapObj<mtGC> {
brutisso@3923 32 friend class G1CollectorPolicy;
brutisso@3923 33 friend class TraceGen0TimeData;
brutisso@3923 34
brutisso@3923 35 private:
brutisso@3923 36 uint _active_gc_threads;
brutisso@3923 37 uint _max_gc_threads;
brutisso@3923 38
brutisso@3923 39 GCCause::Cause _gc_cause;
brutisso@3923 40 bool _is_young_gc;
brutisso@3923 41 bool _is_initial_mark_gc;
brutisso@3923 42
brutisso@3923 43 double _pause_start_time_sec;
brutisso@3923 44
brutisso@3923 45 double* _par_last_gc_worker_start_times_ms;
brutisso@3923 46 double* _par_last_ext_root_scan_times_ms;
brutisso@3923 47 double* _par_last_satb_filtering_times_ms;
brutisso@3923 48 double* _par_last_update_rs_times_ms;
brutisso@3923 49 double* _par_last_update_rs_processed_buffers;
brutisso@3923 50 double* _par_last_scan_rs_times_ms;
brutisso@3923 51 double* _par_last_obj_copy_times_ms;
brutisso@3923 52 double* _par_last_termination_times_ms;
brutisso@3923 53 double* _par_last_termination_attempts;
brutisso@3923 54 double* _par_last_gc_worker_end_times_ms;
brutisso@3923 55 double* _par_last_gc_worker_times_ms;
brutisso@3923 56 double* _par_last_gc_worker_other_times_ms;
brutisso@3923 57
brutisso@3923 58 double _cur_collection_par_time_ms;
brutisso@3923 59
brutisso@3923 60 double _cur_collection_code_root_fixup_time_ms;
brutisso@3923 61
brutisso@3923 62 double _cur_clear_ct_time_ms;
brutisso@3923 63 double _cur_ref_proc_time_ms;
brutisso@3923 64 double _cur_ref_enq_time_ms;
brutisso@3923 65
brutisso@3923 66 // Helper methods for detailed logging
brutisso@3923 67 void print_par_stats(int level, const char* str, double* data, bool showDecimals = true);
brutisso@3923 68 void print_stats(int level, const char* str, double value);
brutisso@3923 69 void print_stats(int level, const char* str, double value, int workers);
brutisso@3923 70 void print_stats(int level, const char* str, int value);
brutisso@3923 71 double avg_value(double* data);
brutisso@3923 72 double max_value(double* data);
brutisso@3923 73 double sum_of_values(double* data);
brutisso@3923 74 double max_sum(double* data1, double* data2);
brutisso@3923 75 double accounted_time_ms();
brutisso@3923 76
brutisso@3923 77 // Card Table Count Cache stats
brutisso@3923 78 double _min_clear_cc_time_ms; // min
brutisso@3923 79 double _max_clear_cc_time_ms; // max
brutisso@3923 80 double _cur_clear_cc_time_ms; // clearing time during current pause
brutisso@3923 81 double _cum_clear_cc_time_ms; // cummulative clearing time
brutisso@3923 82 jlong _num_cc_clears; // number of times the card count cache has been cleared
brutisso@3923 83
brutisso@3923 84 // The following insance variables are directly accessed by G1CollectorPolicy
brutisso@3923 85 // and TraceGen0TimeData. This is why those classes are declared friends.
brutisso@3923 86 // An alternative is to add getters and setters for all of these fields.
brutisso@3923 87 // It might also be possible to restructure the code to reduce these
brutisso@3923 88 // dependencies.
brutisso@3923 89 double _ext_root_scan_time;
brutisso@3923 90 double _satb_filtering_time;
brutisso@3923 91 double _update_rs_time;
brutisso@3923 92 double _update_rs_processed_buffers;
brutisso@3923 93 double _scan_rs_time;
brutisso@3923 94 double _obj_copy_time;
brutisso@3923 95 double _termination_time;
brutisso@3923 96
brutisso@3923 97 double _cur_collection_start_sec;
brutisso@3923 98 double _root_region_scan_wait_time_ms;
brutisso@3923 99
brutisso@3923 100 double _recorded_young_cset_choice_time_ms;
brutisso@3923 101 double _recorded_non_young_cset_choice_time_ms;
brutisso@3923 102
brutisso@3923 103 double _recorded_young_free_cset_time_ms;
brutisso@3923 104 double _recorded_non_young_free_cset_time_ms;
brutisso@3923 105
brutisso@3923 106 void print(double pause_time_ms);
brutisso@3923 107
brutisso@3923 108 public:
brutisso@3923 109 G1GCPhaseTimes(uint max_gc_threads);
brutisso@3923 110 void note_gc_start(double pause_start_time_sec, uint active_gc_threads,
brutisso@3923 111 bool is_young_gc, bool is_initial_mark_gc, GCCause::Cause gc_cause);
brutisso@3923 112 void note_gc_end(double pause_end_time_sec);
brutisso@3923 113 void collapse_par_times();
brutisso@3923 114
brutisso@3923 115 void record_gc_worker_start_time(uint worker_i, double ms) {
brutisso@3923 116 assert(worker_i >= 0, "worker index must be > 0");
brutisso@3923 117 assert(worker_i < _active_gc_threads, "worker index out of bounds");
brutisso@3923 118 _par_last_gc_worker_start_times_ms[worker_i] = ms;
brutisso@3923 119 }
brutisso@3923 120
brutisso@3923 121 void record_ext_root_scan_time(uint worker_i, double ms) {
brutisso@3923 122 assert(worker_i >= 0, "worker index must be > 0");
brutisso@3923 123 assert(worker_i < _active_gc_threads, "worker index out of bounds");
brutisso@3923 124 _par_last_ext_root_scan_times_ms[worker_i] = ms;
brutisso@3923 125 }
brutisso@3923 126
brutisso@3923 127 void record_satb_filtering_time(uint worker_i, double ms) {
brutisso@3923 128 assert(worker_i >= 0, "worker index must be > 0");
brutisso@3923 129 assert(worker_i < _active_gc_threads, "worker index out of bounds");
brutisso@3923 130 _par_last_satb_filtering_times_ms[worker_i] = ms;
brutisso@3923 131 }
brutisso@3923 132
brutisso@3923 133 void record_update_rs_time(uint worker_i, double ms) {
brutisso@3923 134 assert(worker_i >= 0, "worker index must be > 0");
brutisso@3923 135 assert(worker_i < _active_gc_threads, "worker index out of bounds");
brutisso@3923 136 _par_last_update_rs_times_ms[worker_i] = ms;
brutisso@3923 137 }
brutisso@3923 138
brutisso@3923 139 void record_update_rs_processed_buffers (uint worker_i,
brutisso@3923 140 double processed_buffers) {
brutisso@3923 141 assert(worker_i >= 0, "worker index must be > 0");
brutisso@3923 142 assert(worker_i < _active_gc_threads, "worker index out of bounds");
brutisso@3923 143 _par_last_update_rs_processed_buffers[worker_i] = processed_buffers;
brutisso@3923 144 }
brutisso@3923 145
brutisso@3923 146 void record_scan_rs_time(uint worker_i, double ms) {
brutisso@3923 147 assert(worker_i >= 0, "worker index must be > 0");
brutisso@3923 148 assert(worker_i < _active_gc_threads, "worker index out of bounds");
brutisso@3923 149 _par_last_scan_rs_times_ms[worker_i] = ms;
brutisso@3923 150 }
brutisso@3923 151
brutisso@3923 152 void reset_obj_copy_time(uint worker_i) {
brutisso@3923 153 assert(worker_i >= 0, "worker index must be > 0");
brutisso@3923 154 assert(worker_i < _active_gc_threads, "worker index out of bounds");
brutisso@3923 155 _par_last_obj_copy_times_ms[worker_i] = 0.0;
brutisso@3923 156 }
brutisso@3923 157
brutisso@3923 158 void reset_obj_copy_time() {
brutisso@3923 159 reset_obj_copy_time(0);
brutisso@3923 160 }
brutisso@3923 161
brutisso@3923 162 void record_obj_copy_time(uint worker_i, double ms) {
brutisso@3923 163 assert(worker_i >= 0, "worker index must be > 0");
brutisso@3923 164 assert(worker_i < _active_gc_threads, "worker index out of bounds");
brutisso@3923 165 _par_last_obj_copy_times_ms[worker_i] += ms;
brutisso@3923 166 }
brutisso@3923 167
brutisso@3923 168 void record_termination(uint worker_i, double ms, size_t attempts) {
brutisso@3923 169 assert(worker_i >= 0, "worker index must be > 0");
brutisso@3923 170 assert(worker_i < _active_gc_threads, "worker index out of bounds");
brutisso@3923 171 _par_last_termination_times_ms[worker_i] = ms;
brutisso@3923 172 _par_last_termination_attempts[worker_i] = (double) attempts;
brutisso@3923 173 }
brutisso@3923 174
brutisso@3923 175 void record_gc_worker_end_time(uint worker_i, double ms) {
brutisso@3923 176 assert(worker_i >= 0, "worker index must be > 0");
brutisso@3923 177 assert(worker_i < _active_gc_threads, "worker index out of bounds");
brutisso@3923 178 _par_last_gc_worker_end_times_ms[worker_i] = ms;
brutisso@3923 179 }
brutisso@3923 180
brutisso@3923 181 void record_clear_ct_time(double ms) {
brutisso@3923 182 _cur_clear_ct_time_ms = ms;
brutisso@3923 183 }
brutisso@3923 184
brutisso@3923 185 void record_par_time(double ms) {
brutisso@3923 186 _cur_collection_par_time_ms = ms;
brutisso@3923 187 }
brutisso@3923 188
brutisso@3923 189 void record_code_root_fixup_time(double ms) {
brutisso@3923 190 _cur_collection_code_root_fixup_time_ms = ms;
brutisso@3923 191 }
brutisso@3923 192
brutisso@3923 193 void record_ref_proc_time(double ms) {
brutisso@3923 194 _cur_ref_proc_time_ms = ms;
brutisso@3923 195 }
brutisso@3923 196
brutisso@3923 197 void record_ref_enq_time(double ms) {
brutisso@3923 198 _cur_ref_enq_time_ms = ms;
brutisso@3923 199 }
brutisso@3923 200
brutisso@3923 201 void record_root_region_scan_wait_time(double time_ms) {
brutisso@3923 202 _root_region_scan_wait_time_ms = time_ms;
brutisso@3923 203 }
brutisso@3923 204
brutisso@3923 205 void record_cc_clear_time_ms(double ms);
brutisso@3923 206
brutisso@3923 207 void record_young_free_cset_time_ms(double time_ms) {
brutisso@3923 208 _recorded_young_free_cset_time_ms = time_ms;
brutisso@3923 209 }
brutisso@3923 210
brutisso@3923 211 void record_non_young_free_cset_time_ms(double time_ms) {
brutisso@3923 212 _recorded_non_young_free_cset_time_ms = time_ms;
brutisso@3923 213 }
brutisso@3923 214 };
brutisso@3923 215
brutisso@3923 216 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP

mercurial