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