Mercurial > hg > truffle
comparison src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp @ 677:96b229c54d1e
6543938: G1: remove the concept of popularity
Reviewed-by: iveresov, tonyp
author | apetrusenko |
---|---|
date | Wed, 25 Mar 2009 13:10:54 -0700 |
parents | 7bb995fbd3c0 |
children | 315a5d70b295 |
comparison
equal
deleted
inserted
replaced
649:59f139e8a8d1 | 677:96b229c54d1e |
---|---|
45 NumberSeq* get_##name##_seq() { \ | 45 NumberSeq* get_##name##_seq() { \ |
46 return &_all_##name##_times_ms; \ | 46 return &_all_##name##_times_ms; \ |
47 } | 47 } |
48 | 48 |
49 class MainBodySummary; | 49 class MainBodySummary; |
50 class PopPreambleSummary; | |
51 | 50 |
52 class PauseSummary: public CHeapObj { | 51 class PauseSummary: public CHeapObj { |
53 define_num_seq(total) | 52 define_num_seq(total) |
54 define_num_seq(other) | 53 define_num_seq(other) |
55 | 54 |
56 public: | 55 public: |
57 virtual MainBodySummary* main_body_summary() { return NULL; } | 56 virtual MainBodySummary* main_body_summary() { return NULL; } |
58 virtual PopPreambleSummary* pop_preamble_summary() { return NULL; } | |
59 }; | 57 }; |
60 | 58 |
61 class MainBodySummary: public CHeapObj { | 59 class MainBodySummary: public CHeapObj { |
62 define_num_seq(satb_drain) // optional | 60 define_num_seq(satb_drain) // optional |
63 define_num_seq(parallel) // parallel only | 61 define_num_seq(parallel) // parallel only |
73 define_num_seq(parallel_other) // parallel only | 71 define_num_seq(parallel_other) // parallel only |
74 define_num_seq(mark_closure) | 72 define_num_seq(mark_closure) |
75 define_num_seq(clear_ct) // parallel only | 73 define_num_seq(clear_ct) // parallel only |
76 }; | 74 }; |
77 | 75 |
78 class PopPreambleSummary: public CHeapObj { | 76 class Summary: public PauseSummary, |
79 define_num_seq(pop_preamble) | 77 public MainBodySummary { |
80 define_num_seq(pop_update_rs) | |
81 define_num_seq(pop_scan_rs) | |
82 define_num_seq(pop_closure_app) | |
83 define_num_seq(pop_evacuation) | |
84 define_num_seq(pop_other) | |
85 }; | |
86 | |
87 class NonPopSummary: public PauseSummary, | |
88 public MainBodySummary { | |
89 public: | 78 public: |
90 virtual MainBodySummary* main_body_summary() { return this; } | 79 virtual MainBodySummary* main_body_summary() { return this; } |
91 }; | 80 }; |
92 | 81 |
93 class PopSummary: public PauseSummary, | 82 class AbandonedSummary: public PauseSummary { |
94 public MainBodySummary, | |
95 public PopPreambleSummary { | |
96 public: | |
97 virtual MainBodySummary* main_body_summary() { return this; } | |
98 virtual PopPreambleSummary* pop_preamble_summary() { return this; } | |
99 }; | |
100 | |
101 class NonPopAbandonedSummary: public PauseSummary { | |
102 }; | |
103 | |
104 class PopAbandonedSummary: public PauseSummary, | |
105 public PopPreambleSummary { | |
106 public: | |
107 virtual PopPreambleSummary* pop_preamble_summary() { return this; } | |
108 }; | 83 }; |
109 | 84 |
110 class G1CollectorPolicy: public CollectorPolicy { | 85 class G1CollectorPolicy: public CollectorPolicy { |
111 protected: | 86 protected: |
112 // The number of pauses during the execution. | 87 // The number of pauses during the execution. |
144 size_t _prev_collection_pause_used_at_end_bytes; | 119 size_t _prev_collection_pause_used_at_end_bytes; |
145 double _cur_collection_par_time_ms; | 120 double _cur_collection_par_time_ms; |
146 double _cur_satb_drain_time_ms; | 121 double _cur_satb_drain_time_ms; |
147 double _cur_clear_ct_time_ms; | 122 double _cur_clear_ct_time_ms; |
148 bool _satb_drain_time_set; | 123 bool _satb_drain_time_set; |
149 double _cur_popular_preamble_start_ms; | |
150 double _cur_popular_preamble_time_ms; | |
151 double _cur_popular_compute_rc_time_ms; | |
152 double _cur_popular_evac_time_ms; | |
153 | 124 |
154 double _cur_CH_strong_roots_end_sec; | 125 double _cur_CH_strong_roots_end_sec; |
155 double _cur_CH_strong_roots_dur_ms; | 126 double _cur_CH_strong_roots_dur_ms; |
156 double _cur_G1_strong_roots_end_sec; | 127 double _cur_G1_strong_roots_end_sec; |
157 double _cur_G1_strong_roots_dur_ms; | 128 double _cur_G1_strong_roots_dur_ms; |
171 | 142 |
172 TruncatedSeq* _concurrent_mark_init_times_ms; | 143 TruncatedSeq* _concurrent_mark_init_times_ms; |
173 TruncatedSeq* _concurrent_mark_remark_times_ms; | 144 TruncatedSeq* _concurrent_mark_remark_times_ms; |
174 TruncatedSeq* _concurrent_mark_cleanup_times_ms; | 145 TruncatedSeq* _concurrent_mark_cleanup_times_ms; |
175 | 146 |
176 NonPopSummary* _non_pop_summary; | 147 Summary* _summary; |
177 PopSummary* _pop_summary; | 148 AbandonedSummary* _abandoned_summary; |
178 NonPopAbandonedSummary* _non_pop_abandoned_summary; | |
179 PopAbandonedSummary* _pop_abandoned_summary; | |
180 | 149 |
181 NumberSeq* _all_pause_times_ms; | 150 NumberSeq* _all_pause_times_ms; |
182 NumberSeq* _all_full_gc_times_ms; | 151 NumberSeq* _all_full_gc_times_ms; |
183 double _stop_world_start; | 152 double _stop_world_start; |
184 NumberSeq* _all_stop_world_times_ms; | 153 NumberSeq* _all_stop_world_times_ms; |
208 double* _par_last_scan_rs_times_ms; | 177 double* _par_last_scan_rs_times_ms; |
209 double* _par_last_scan_new_refs_times_ms; | 178 double* _par_last_scan_new_refs_times_ms; |
210 double* _par_last_obj_copy_times_ms; | 179 double* _par_last_obj_copy_times_ms; |
211 double* _par_last_termination_times_ms; | 180 double* _par_last_termination_times_ms; |
212 | 181 |
213 // there are two pases during popular pauses, so we need to store | |
214 // somewhere the results of the first pass | |
215 double* _pop_par_last_update_rs_start_times_ms; | |
216 double* _pop_par_last_update_rs_times_ms; | |
217 double* _pop_par_last_update_rs_processed_buffers; | |
218 double* _pop_par_last_scan_rs_start_times_ms; | |
219 double* _pop_par_last_scan_rs_times_ms; | |
220 double* _pop_par_last_closure_app_times_ms; | |
221 | |
222 double _pop_compute_rc_start; | |
223 double _pop_evac_start; | |
224 | |
225 // indicates that we are in young GC mode | 182 // indicates that we are in young GC mode |
226 bool _in_young_gc_mode; | 183 bool _in_young_gc_mode; |
227 | 184 |
228 // indicates whether we are in full young or partially young GC mode | 185 // indicates whether we are in full young or partially young GC mode |
229 bool _full_young_gcs; | 186 bool _full_young_gcs; |
632 void check_other_times(int level, | 589 void check_other_times(int level, |
633 NumberSeq* other_times_ms, | 590 NumberSeq* other_times_ms, |
634 NumberSeq* calc_other_times_ms) const; | 591 NumberSeq* calc_other_times_ms) const; |
635 | 592 |
636 void print_summary (PauseSummary* stats) const; | 593 void print_summary (PauseSummary* stats) const; |
637 void print_abandoned_summary(PauseSummary* non_pop_summary, | 594 void print_abandoned_summary(PauseSummary* summary) const; |
638 PauseSummary* pop_summary) const; | |
639 | 595 |
640 void print_summary (int level, const char* str, NumberSeq* seq) const; | 596 void print_summary (int level, const char* str, NumberSeq* seq) const; |
641 void print_summary_sd (int level, const char* str, NumberSeq* seq) const; | 597 void print_summary_sd (int level, const char* str, NumberSeq* seq) const; |
642 | 598 |
643 double avg_value (double* data); | 599 double avg_value (double* data); |
854 virtual void record_stop_world_start(); | 810 virtual void record_stop_world_start(); |
855 | 811 |
856 virtual void record_collection_pause_start(double start_time_sec, | 812 virtual void record_collection_pause_start(double start_time_sec, |
857 size_t start_used); | 813 size_t start_used); |
858 | 814 |
859 virtual void record_popular_pause_preamble_start(); | |
860 virtual void record_popular_pause_preamble_end(); | |
861 | |
862 // Must currently be called while the world is stopped. | 815 // Must currently be called while the world is stopped. |
863 virtual void record_concurrent_mark_init_start(); | 816 virtual void record_concurrent_mark_init_start(); |
864 virtual void record_concurrent_mark_init_end(); | 817 virtual void record_concurrent_mark_init_end(); |
865 void record_concurrent_mark_init_end_pre(double | 818 void record_concurrent_mark_init_end_pre(double |
866 mark_init_elapsed_time_ms); | 819 mark_init_elapsed_time_ms); |
879 virtual void record_concurrent_pause_end(); | 832 virtual void record_concurrent_pause_end(); |
880 | 833 |
881 virtual void record_collection_pause_end_CH_strong_roots(); | 834 virtual void record_collection_pause_end_CH_strong_roots(); |
882 virtual void record_collection_pause_end_G1_strong_roots(); | 835 virtual void record_collection_pause_end_G1_strong_roots(); |
883 | 836 |
884 virtual void record_collection_pause_end(bool popular, bool abandoned); | 837 virtual void record_collection_pause_end(bool abandoned); |
885 | 838 |
886 // Record the fact that a full collection occurred. | 839 // Record the fact that a full collection occurred. |
887 virtual void record_full_collection_start(); | 840 virtual void record_full_collection_start(); |
888 virtual void record_full_collection_end(); | 841 virtual void record_full_collection_end(); |
889 | 842 |
988 double ms = os::elapsedTime() * 1000.0 - _cur_aux_start_times_ms[i]; | 941 double ms = os::elapsedTime() * 1000.0 - _cur_aux_start_times_ms[i]; |
989 _cur_aux_times_set[i] = true; | 942 _cur_aux_times_set[i] = true; |
990 _cur_aux_times_ms[i] += ms; | 943 _cur_aux_times_ms[i] += ms; |
991 } | 944 } |
992 | 945 |
993 void record_pop_compute_rc_start(); | |
994 void record_pop_compute_rc_end(); | |
995 | |
996 void record_pop_evac_start(); | |
997 void record_pop_evac_end(); | |
998 | |
999 // Record the fact that "bytes" bytes allocated in a region. | 946 // Record the fact that "bytes" bytes allocated in a region. |
1000 void record_before_bytes(size_t bytes); | 947 void record_before_bytes(size_t bytes); |
1001 void record_after_bytes(size_t bytes); | 948 void record_after_bytes(size_t bytes); |
1002 | 949 |
1003 // Returns "true" if this is a good time to do a collection pause. | 950 // Returns "true" if this is a good time to do a collection pause. |
1006 virtual bool should_do_collection_pause(size_t word_size) = 0; | 953 virtual bool should_do_collection_pause(size_t word_size) = 0; |
1007 | 954 |
1008 // Choose a new collection set. Marks the chosen regions as being | 955 // Choose a new collection set. Marks the chosen regions as being |
1009 // "in_collection_set", and links them together. The head and number of | 956 // "in_collection_set", and links them together. The head and number of |
1010 // the collection set are available via access methods. | 957 // the collection set are available via access methods. |
1011 // If "pop_region" is non-NULL, it is a popular region that has already | 958 virtual void choose_collection_set() = 0; |
1012 // been added to the collection set. | |
1013 virtual void choose_collection_set(HeapRegion* pop_region = NULL) = 0; | |
1014 | 959 |
1015 void clear_collection_set() { _collection_set = NULL; } | 960 void clear_collection_set() { _collection_set = NULL; } |
1016 | 961 |
1017 // The head of the list (via "next_in_collection_set()") representing the | 962 // The head of the list (via "next_in_collection_set()") representing the |
1018 // current collection set. | 963 // current collection set. |
1019 HeapRegion* collection_set() { return _collection_set; } | 964 HeapRegion* collection_set() { return _collection_set; } |
1020 | |
1021 // Sets the collection set to the given single region. | |
1022 virtual void set_single_region_collection_set(HeapRegion* hr); | |
1023 | 965 |
1024 // The number of elements in the current collection set. | 966 // The number of elements in the current collection set. |
1025 size_t collection_set_size() { return _collection_set_size; } | 967 size_t collection_set_size() { return _collection_set_size; } |
1026 | 968 |
1027 // Add "hr" to the CS. | 969 // Add "hr" to the CS. |
1201 class G1CollectorPolicy_BestRegionsFirst: public G1CollectorPolicy { | 1143 class G1CollectorPolicy_BestRegionsFirst: public G1CollectorPolicy { |
1202 CollectionSetChooser* _collectionSetChooser; | 1144 CollectionSetChooser* _collectionSetChooser; |
1203 // If the estimated is less then desirable, resize if possible. | 1145 // If the estimated is less then desirable, resize if possible. |
1204 void expand_if_possible(size_t numRegions); | 1146 void expand_if_possible(size_t numRegions); |
1205 | 1147 |
1206 virtual void choose_collection_set(HeapRegion* pop_region = NULL); | 1148 virtual void choose_collection_set(); |
1207 virtual void record_collection_pause_start(double start_time_sec, | 1149 virtual void record_collection_pause_start(double start_time_sec, |
1208 size_t start_used); | 1150 size_t start_used); |
1209 virtual void record_concurrent_mark_cleanup_end(size_t freed_bytes, | 1151 virtual void record_concurrent_mark_cleanup_end(size_t freed_bytes, |
1210 size_t max_live_bytes); | 1152 size_t max_live_bytes); |
1211 virtual void record_full_collection_end(); | 1153 virtual void record_full_collection_end(); |
1212 | 1154 |
1213 public: | 1155 public: |
1214 G1CollectorPolicy_BestRegionsFirst() { | 1156 G1CollectorPolicy_BestRegionsFirst() { |
1215 _collectionSetChooser = new CollectionSetChooser(); | 1157 _collectionSetChooser = new CollectionSetChooser(); |
1216 } | 1158 } |
1217 void record_collection_pause_end(bool popular, bool abandoned); | 1159 void record_collection_pause_end(bool abandoned); |
1218 bool should_do_collection_pause(size_t word_size); | 1160 bool should_do_collection_pause(size_t word_size); |
1219 virtual void set_single_region_collection_set(HeapRegion* hr); | |
1220 // This is not needed any more, after the CSet choosing code was | 1161 // This is not needed any more, after the CSet choosing code was |
1221 // changed to use the pause prediction work. But let's leave the | 1162 // changed to use the pause prediction work. But let's leave the |
1222 // hook in just in case. | 1163 // hook in just in case. |
1223 void note_change_in_marked_bytes(HeapRegion* r) { } | 1164 void note_change_in_marked_bytes(HeapRegion* r) { } |
1224 #ifndef PRODUCT | 1165 #ifndef PRODUCT |