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 TruncatedSeq* _cost_per_logged_card_ms_seq;
52 TruncatedSeq* _cost_scan_hcc_seq;
53 TruncatedSeq* _young_cards_per_entry_ratio_seq;
54 TruncatedSeq* _mixed_cards_per_entry_ratio_seq;
55 TruncatedSeq* _young_only_cost_per_remset_card_ms_seq;
56 TruncatedSeq* _mixed_cost_per_remset_card_ms_seq;
57 TruncatedSeq* _cost_per_byte_ms_seq;
58 TruncatedSeq* _constant_other_time_ms_seq;
59 TruncatedSeq* _young_other_cost_per_region_ms_seq;
60 TruncatedSeq* _non_young_other_cost_per_region_ms_seq;
61
62 TruncatedSeq* _pending_cards_seq;
63 TruncatedSeq* _rs_length_seq;
64
65 TruncatedSeq* _cost_per_byte_ms_during_cm_seq;
66
67 // Statistics kept per GC stoppage, pause or full.
68 TruncatedSeq* _recent_prev_end_times_for_all_gcs_sec;
69
70 // The ratio of gc time to elapsed time, computed over recent pauses,
71 // and the ratio for just the last pause.
72 double _recent_avg_pause_time_ratio;
73 double _last_pause_time_ratio;
74
75 double get_new_prediction(TruncatedSeq const* seq) const;
76 size_t get_new_size_prediction(TruncatedSeq const* seq) const;
77
78 public:
79 G1Analytics(const G1Predictions* predictor);
80
81 double prev_collection_pause_end_ms() const {
82 return _prev_collection_pause_end_ms;
83 }
84
85 double recent_avg_pause_time_ratio() const {
86 return _recent_avg_pause_time_ratio;
87 }
88
89 double last_pause_time_ratio() const {
90 return _last_pause_time_ratio;
91 }
92
93 uint number_of_recorded_pause_times() const {
94 return NumPrevPausesForHeuristics;
95 }
96
97 void append_prev_collection_pause_end_ms(double ms) {
98 _prev_collection_pause_end_ms += ms;
99 }
100
101 void report_concurrent_mark_remark_times_ms(double ms);
102 void report_concurrent_mark_cleanup_times_ms(double ms);
103 void report_alloc_rate_ms(double alloc_rate);
104 void report_concurrent_refine_rate_ms(double cards_per_ms);
105 void report_logged_cards_rate_ms(double cards_per_ms);
106 void report_cost_per_logged_card_ms(double cost_per_logged_card_ms);
107 void report_cost_scan_hcc(double cost_scan_hcc);
108 void report_cost_per_remset_card_ms(double cost_per_remset_card_ms, bool for_young_gc);
109 void report_cards_per_entry_ratio(double cards_per_entry_ratio, bool for_young_gc);
110 void report_rs_length_diff(double rs_length_diff);
111 void report_cost_per_byte_ms(double cost_per_byte_ms, bool mark_or_rebuild_in_progress);
112 void report_young_other_cost_per_region_ms(double other_cost_per_region_ms);
113 void report_non_young_other_cost_per_region_ms(double other_cost_per_region_ms);
114 void report_constant_other_time_ms(double constant_other_time_ms);
115 void report_pending_cards(double pending_cards);
116 void report_rs_length(double rs_length);
117
118 double predict_alloc_rate_ms() const;
119 int num_alloc_rate_ms() const;
120
121 double predict_concurrent_refine_rate_ms() const;
122 double predict_logged_cards_rate_ms() const;
123 double predict_cost_per_logged_card_ms() const;
124
125 double predict_scan_hcc_ms() const;
126
127 double predict_rs_update_time_ms(size_t pending_cards) const;
128
129 double predict_young_cards_per_entry_ratio() const;
130
131 double predict_mixed_cards_per_entry_ratio() const;
132
133 size_t predict_card_num(size_t rs_length, bool for_young_gc) const;
134
135 double predict_rs_scan_time_ms(size_t card_num, bool for_young_gc) const;
136
137 double predict_mixed_rs_scan_time_ms(size_t card_num) 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 double predict_cost_per_byte_ms() const;
157
158 // Add a new GC of the given duration and end time to the record.
159 void update_recent_gc_times(double end_time_sec, double elapsed_ms);
160 void compute_pause_time_ratio(double interval_ms, double pause_time_ms);
161
162 double last_known_gc_end_time_sec() const;
163 };
164
165 #endif // SHARE_GC_G1_G1ANALYTICS_HPP
|
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 // Returns whether the sequence have enough samples to get a "good" prediction.
84 // The constant used is random but "small".
85 bool enough_samples_available(TruncatedSeq const* seq) const { return seq->num() >= 3; }
86
87 double get_new_prediction(TruncatedSeq const* seq) const;
88 size_t get_new_size_prediction(TruncatedSeq const* seq) const;
89
90 public:
91 G1Analytics(const G1Predictions* predictor);
92
93 double prev_collection_pause_end_ms() const {
94 return _prev_collection_pause_end_ms;
95 }
96
97 double recent_avg_pause_time_ratio() const {
98 return _recent_avg_pause_time_ratio;
99 }
100
101 double last_pause_time_ratio() const {
102 return _last_pause_time_ratio;
103 }
104
105 uint number_of_recorded_pause_times() const {
106 return NumPrevPausesForHeuristics;
107 }
108
109 void append_prev_collection_pause_end_ms(double ms) {
110 _prev_collection_pause_end_ms += ms;
111 }
112
113 void report_concurrent_mark_remark_times_ms(double ms);
114 void report_concurrent_mark_cleanup_times_ms(double ms);
115 void report_alloc_rate_ms(double alloc_rate);
116 void report_concurrent_refine_rate_ms(double cards_per_ms);
117 void report_logged_cards_rate_ms(double cards_per_ms);
118 void report_cost_per_card_scan_ms(double cost_per_remset_card_ms, bool for_young_gc);
119 void report_cost_per_card_merge_ms(double cost_per_card_ms, bool for_young_gc);
120 void report_card_merge_to_scan_ratio(double cards_per_entry_ratio, bool for_young_gc);
121 void report_rs_length_diff(double rs_length_diff);
122 void report_cost_per_byte_ms(double cost_per_byte_ms, bool mark_or_rebuild_in_progress);
123 void report_young_other_cost_per_region_ms(double other_cost_per_region_ms);
124 void report_non_young_other_cost_per_region_ms(double other_cost_per_region_ms);
125 void report_constant_other_time_ms(double constant_other_time_ms);
126 void report_pending_cards(double pending_cards);
127 void report_rs_length(double rs_length);
128
129 double predict_alloc_rate_ms() const;
130 int num_alloc_rate_ms() const;
131
132 double predict_concurrent_refine_rate_ms() const;
133 double predict_logged_cards_rate_ms() const;
134 double predict_young_card_merge_to_scan_ratio() const;
135
136 double predict_mixed_card_merge_to_scan_ratio() const;
137
138 size_t predict_scan_card_num(size_t rs_length, bool for_young_gc) const;
139
140 double predict_card_merge_time_ms(size_t card_num, bool for_young_gc) const;
141 double predict_card_scan_time_ms(size_t card_num, bool for_young_gc) const;
142
143 double predict_object_copy_time_ms_during_cm(size_t bytes_to_copy) const;
144
145 double predict_object_copy_time_ms(size_t bytes_to_copy, bool during_concurrent_mark) const;
146
147 double predict_constant_other_time_ms() const;
148
149 double predict_young_other_time_ms(size_t young_num) const;
150
151 double predict_non_young_other_time_ms(size_t non_young_num) const;
152
153 double predict_remark_time_ms() const;
154
155 double predict_cleanup_time_ms() const;
156
157 size_t predict_rs_length() const;
158 size_t predict_pending_cards() const;
159
160 // Add a new GC of the given duration and end time to the record.
161 void update_recent_gc_times(double end_time_sec, double elapsed_ms);
162 void compute_pause_time_ratio(double interval_ms, double pause_time_ms);
163
164 double last_known_gc_end_time_sec() const;
165 };
166
167 #endif // SHARE_GC_G1_G1ANALYTICS_HPP
|