1 /* 2 * Copyright (c) 2016, 2019, 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 */ 24 25 #ifndef SHARE_GC_G1_G1ANALYTICS_HPP 26 #define SHARE_GC_G1_G1ANALYTICS_HPP 27 28 #include "memory/allocation.hpp" 29 #include "utilities/globalDefinitions.hpp" 30 31 class TruncatedSeq; 32 class G1Predictions; 33 34 class G1Analytics: public CHeapObj<mtGC> { 35 const static int TruncatedSeqLength = 10; 36 const static int NumPrevPausesForHeuristics = 10; 37 const G1Predictions* _predictor; 38 39 // These exclude marking times. 40 TruncatedSeq* _recent_gc_times_ms; 41 42 TruncatedSeq* _concurrent_mark_remark_times_ms; 43 TruncatedSeq* _concurrent_mark_cleanup_times_ms; 44 45 TruncatedSeq* _alloc_rate_ms_seq; 46 double _prev_collection_pause_end_ms; 47 48 TruncatedSeq* _rs_length_diff_seq; 49 TruncatedSeq* _concurrent_refine_rate_ms_seq; 50 TruncatedSeq* _logged_cards_rate_ms_seq; 51 // The ratio between the number of merged cards and actually scanned cards, for 52 // young-only and mixed gcs. 53 TruncatedSeq* _young_card_merge_to_scan_ratio_seq; 54 TruncatedSeq* _mixed_card_merge_to_scan_ratio_seq; 55 56 // The cost to scan a card during young-only and mixed gcs in ms. 57 TruncatedSeq* _young_cost_per_card_scan_ms_seq; 58 TruncatedSeq* _mixed_cost_per_card_scan_ms_seq; 59 60 // The cost to merge a card during young-only and mixed gcs in ms. 61 TruncatedSeq* _young_cost_per_card_merge_ms_seq; 62 TruncatedSeq* _mixed_cost_per_card_merge_ms_seq; 63 64 // The cost to copy a byte in ms. 65 TruncatedSeq* _copy_cost_per_byte_ms_seq; 66 TruncatedSeq* _constant_other_time_ms_seq; 67 TruncatedSeq* _young_other_cost_per_region_ms_seq; 68 TruncatedSeq* _non_young_other_cost_per_region_ms_seq; 69 70 TruncatedSeq* _pending_cards_seq; 71 TruncatedSeq* _rs_length_seq; 72 73 TruncatedSeq* _cost_per_byte_ms_during_cm_seq; 74 75 // Statistics kept per GC stoppage, pause or full. 76 TruncatedSeq* _recent_prev_end_times_for_all_gcs_sec; 77 78 // The ratio of gc time to elapsed time, computed over recent pauses, 79 // and the ratio for just the last pause. 80 double _recent_avg_pause_time_ratio; 81 double _last_pause_time_ratio; 82 83 double get_new_prediction(TruncatedSeq const* seq) const; 84 size_t get_new_size_prediction(TruncatedSeq const* seq) const; 85 86 public: 87 G1Analytics(const G1Predictions* predictor); 88 89 double prev_collection_pause_end_ms() const { 90 return _prev_collection_pause_end_ms; 91 } 92 93 double recent_avg_pause_time_ratio() const { 94 return _recent_avg_pause_time_ratio; 95 } 96 97 double last_pause_time_ratio() const { 98 return _last_pause_time_ratio; 99 } 100 101 uint number_of_recorded_pause_times() const { 102 return NumPrevPausesForHeuristics; 103 } 104 105 void append_prev_collection_pause_end_ms(double ms) { 106 _prev_collection_pause_end_ms += ms; 107 } 108 109 void report_concurrent_mark_remark_times_ms(double ms); 110 void report_concurrent_mark_cleanup_times_ms(double ms); 111 void report_alloc_rate_ms(double alloc_rate); 112 void report_concurrent_refine_rate_ms(double cards_per_ms); 113 void report_logged_cards_rate_ms(double cards_per_ms); 114 void report_cost_per_card_scan_ms(double cost_per_remset_card_ms, bool for_young_gc); 115 void report_cost_per_card_merge_ms(double cost_per_card_ms, bool for_young_gc); 116 void report_card_merge_to_scan_ratio(double cards_per_entry_ratio, bool for_young_gc); 117 void report_rs_length_diff(double rs_length_diff); 118 void report_cost_per_byte_ms(double cost_per_byte_ms, bool mark_or_rebuild_in_progress); 119 void report_young_other_cost_per_region_ms(double other_cost_per_region_ms); 120 void report_non_young_other_cost_per_region_ms(double other_cost_per_region_ms); 121 void report_constant_other_time_ms(double constant_other_time_ms); 122 void report_pending_cards(double pending_cards); 123 void report_rs_length(double rs_length); 124 125 double predict_alloc_rate_ms() const; 126 int num_alloc_rate_ms() const; 127 128 double predict_concurrent_refine_rate_ms() const; 129 double predict_logged_cards_rate_ms() const; 130 double predict_young_card_merge_to_scan_ratio() const; 131 132 double predict_mixed_card_merge_to_scan_ratio() const; 133 134 size_t predict_scan_card_num(size_t rs_length, bool for_young_gc) const; 135 136 double predict_card_merge_time_ms(size_t card_num, bool for_young_gc) const; 137 double predict_card_scan_time_ms(size_t card_num, bool for_young_gc) const; 138 139 double predict_object_copy_time_ms_during_cm(size_t bytes_to_copy) const; 140 141 double predict_object_copy_time_ms(size_t bytes_to_copy, bool during_concurrent_mark) const; 142 143 double predict_constant_other_time_ms() const; 144 145 double predict_young_other_time_ms(size_t young_num) const; 146 147 double predict_non_young_other_time_ms(size_t non_young_num) const; 148 149 double predict_remark_time_ms() const; 150 151 double predict_cleanup_time_ms() const; 152 153 size_t predict_rs_length() const; 154 size_t predict_pending_cards() const; 155 156 // Add a new GC of the given duration and end time to the record. 157 void update_recent_gc_times(double end_time_sec, double elapsed_ms); 158 void compute_pause_time_ratio(double interval_ms, double pause_time_ms); 159 160 double last_known_gc_end_time_sec() const; 161 }; 162 163 #endif // SHARE_GC_G1_G1ANALYTICS_HPP