comparison src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp @ 3488:922993931b3d

7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause Summary: Also reviewed by: vitalyd@gmail.com. Move the timing out of G1CollectorPolicy into the G1GCPhaseTimes class Reviewed-by: johnc
author brutisso
date Wed, 11 Jul 2012 22:47:38 +0200
parents bbc900c2482a
children 3a431b605145
comparison
equal deleted inserted replaced
55:322173e8934f 57:5c73d75e0f07
34 // * choice of collection set. 34 // * choice of collection set.
35 // * when to collect. 35 // * when to collect.
36 36
37 class HeapRegion; 37 class HeapRegion;
38 class CollectionSetChooser; 38 class CollectionSetChooser;
39 class G1GCPhaseTimes;
39 40
40 // TraceGen0Time collects data on _both_ young and mixed evacuation pauses 41 // TraceGen0Time collects data on _both_ young and mixed evacuation pauses
41 // (the latter may contain non-young regions - i.e. regions that are 42 // (the latter may contain non-young regions - i.e. regions that are
42 // technically in Gen1) while TraceGen1Time collects data about full GCs. 43 // technically in Gen1) while TraceGen1Time collects data about full GCs.
43 class TraceGen0TimeData : public CHeapObj { 44 class TraceGen0TimeData : public CHeapObj {
59 NumberSeq _obj_copy; 60 NumberSeq _obj_copy;
60 NumberSeq _termination; 61 NumberSeq _termination;
61 NumberSeq _parallel_other; 62 NumberSeq _parallel_other;
62 NumberSeq _clear_ct; 63 NumberSeq _clear_ct;
63 64
64 void print_summary (int level, const char* str, const NumberSeq* seq) const; 65 void print_summary(const char* str, const NumberSeq* seq) const;
65 void print_summary_sd (int level, const char* str, const NumberSeq* seq) const; 66 void print_summary_sd(const char* str, const NumberSeq* seq) const;
66 67
67 public: 68 public:
68 TraceGen0TimeData() : _young_pause_num(0), _mixed_pause_num(0) {}; 69 TraceGen0TimeData() : _young_pause_num(0), _mixed_pause_num(0) {};
69 void record_start_collection(double time_to_stop_the_world_ms); 70 void record_start_collection(double time_to_stop_the_world_ms);
70 void record_yield_time(double yield_time_ms); 71 void record_yield_time(double yield_time_ms);
71 void record_end_collection( 72 void record_end_collection(double pause_time_ms, G1GCPhaseTimes* phase_times);
72 double total_ms,
73 double other_ms,
74 double root_region_scan_wait_ms,
75 double parallel_ms,
76 double ext_root_scan_ms,
77 double satb_filtering_ms,
78 double update_rs_ms,
79 double scan_rs_ms,
80 double obj_copy_ms,
81 double termination_ms,
82 double parallel_other_ms,
83 double clear_ct_ms);
84 void increment_young_collection_count(); 73 void increment_young_collection_count();
85 void increment_mixed_collection_count(); 74 void increment_mixed_collection_count();
86 void print() const; 75 void print() const;
87 }; 76 };
88 77
184 initialize_perm_generation(PermGen::MarkSweepCompact); 173 initialize_perm_generation(PermGen::MarkSweepCompact);
185 } 174 }
186 175
187 CollectionSetChooser* _collectionSetChooser; 176 CollectionSetChooser* _collectionSetChooser;
188 177
189 double _cur_collection_start_sec; 178 double _full_collection_start_sec;
190 size_t _cur_collection_pause_used_at_start_bytes; 179 size_t _cur_collection_pause_used_at_start_bytes;
191 uint _cur_collection_pause_used_regions_at_start; 180 uint _cur_collection_pause_used_regions_at_start;
192 double _cur_collection_par_time_ms;
193
194 double _cur_collection_code_root_fixup_time_ms;
195
196 double _cur_clear_ct_time_ms;
197 double _cur_ref_proc_time_ms;
198 double _cur_ref_enq_time_ms;
199
200 #ifndef PRODUCT
201 // Card Table Count Cache stats
202 double _min_clear_cc_time_ms; // min
203 double _max_clear_cc_time_ms; // max
204 double _cur_clear_cc_time_ms; // clearing time during current pause
205 double _cum_clear_cc_time_ms; // cummulative clearing time
206 jlong _num_cc_clears; // number of times the card count cache has been cleared
207 #endif
208 181
209 // These exclude marking times. 182 // These exclude marking times.
210 TruncatedSeq* _recent_gc_times_ms; 183 TruncatedSeq* _recent_gc_times_ms;
211 184
212 TruncatedSeq* _concurrent_mark_remark_times_ms; 185 TruncatedSeq* _concurrent_mark_remark_times_ms;
214 187
215 TraceGen0TimeData _trace_gen0_time_data; 188 TraceGen0TimeData _trace_gen0_time_data;
216 TraceGen1TimeData _trace_gen1_time_data; 189 TraceGen1TimeData _trace_gen1_time_data;
217 190
218 double _stop_world_start; 191 double _stop_world_start;
219
220 double* _par_last_gc_worker_start_times_ms;
221 double* _par_last_ext_root_scan_times_ms;
222 double* _par_last_satb_filtering_times_ms;
223 double* _par_last_update_rs_times_ms;
224 double* _par_last_update_rs_processed_buffers;
225 double* _par_last_scan_rs_times_ms;
226 double* _par_last_obj_copy_times_ms;
227 double* _par_last_termination_times_ms;
228 double* _par_last_termination_attempts;
229 double* _par_last_gc_worker_end_times_ms;
230 double* _par_last_gc_worker_times_ms;
231
232 // Each workers 'other' time i.e. the elapsed time of the parallel
233 // code executed by a worker minus the sum of the individual sub-phase
234 // times for that worker thread.
235 double* _par_last_gc_worker_other_times_ms;
236 192
237 // indicates whether we are in young or mixed GC mode 193 // indicates whether we are in young or mixed GC mode
238 bool _gcs_are_young; 194 bool _gcs_are_young;
239 195
240 uint _young_list_target_length; 196 uint _young_list_target_length;
304 260
305 uint _free_regions_at_end_of_collection; 261 uint _free_regions_at_end_of_collection;
306 262
307 size_t _recorded_rs_lengths; 263 size_t _recorded_rs_lengths;
308 size_t _max_rs_lengths; 264 size_t _max_rs_lengths;
309
310 double _recorded_young_free_cset_time_ms;
311 double _recorded_non_young_free_cset_time_ms;
312
313 double _sigma; 265 double _sigma;
314 266
315 size_t _rs_lengths_prediction; 267 size_t _rs_lengths_prediction;
316 268
317 double sigma() { return _sigma; } 269 double sigma() { return _sigma; }
339 291
340 uintx no_of_gc_threads() { return _no_of_gc_threads; } 292 uintx no_of_gc_threads() { return _no_of_gc_threads; }
341 void set_no_of_gc_threads(uintx v) { _no_of_gc_threads = v; } 293 void set_no_of_gc_threads(uintx v) { _no_of_gc_threads = v; }
342 294
343 double _pause_time_target_ms; 295 double _pause_time_target_ms;
344 double _recorded_young_cset_choice_time_ms; 296
345 double _recorded_non_young_cset_choice_time_ms;
346 size_t _pending_cards; 297 size_t _pending_cards;
347 size_t _max_pending_cards; 298 size_t _max_pending_cards;
348 299
349 public: 300 public:
350 // Accessors 301 // Accessors
494 445
495 uint cset_region_length() { return young_cset_region_length() + 446 uint cset_region_length() { return young_cset_region_length() +
496 old_cset_region_length(); } 447 old_cset_region_length(); }
497 uint young_cset_region_length() { return eden_cset_region_length() + 448 uint young_cset_region_length() { return eden_cset_region_length() +
498 survivor_cset_region_length(); } 449 survivor_cset_region_length(); }
499
500 void record_young_free_cset_time_ms(double time_ms) {
501 _recorded_young_free_cset_time_ms = time_ms;
502 }
503
504 void record_non_young_free_cset_time_ms(double time_ms) {
505 _recorded_non_young_free_cset_time_ms = time_ms;
506 }
507 450
508 double predict_survivor_regions_evac_time(); 451 double predict_survivor_regions_evac_time();
509 452
510 void cset_regions_freed() { 453 void cset_regions_freed() {
511 bool propagate = _last_gc_was_young && !_in_marking_window; 454 bool propagate = _last_gc_was_young && !_in_marking_window;
550 double accum_yg_surv_rate_pred(int age) { 493 double accum_yg_surv_rate_pred(int age) {
551 return _short_lived_surv_rate_group->accum_surv_rate_pred(age); 494 return _short_lived_surv_rate_group->accum_surv_rate_pred(age);
552 } 495 }
553 496
554 private: 497 private:
555 void print_stats(int level, const char* str, double value);
556 void print_stats(int level, const char* str, double value, int workers);
557 void print_stats(int level, const char* str, int value);
558
559 void print_par_stats(int level, const char* str, double* data, bool showDecimals = true);
560
561 double avg_value (double* data);
562 double max_value (double* data);
563 double sum_of_values (double* data);
564 double max_sum (double* data1, double* data2);
565
566 double _last_pause_time_ms;
567
568 size_t _bytes_in_collection_set_before_gc; 498 size_t _bytes_in_collection_set_before_gc;
569 size_t _bytes_copied_during_gc; 499 size_t _bytes_copied_during_gc;
570 500
571 // Used to count used bytes in CS. 501 // Used to count used bytes in CS.
572 friend class CountCSClosure; 502 friend class CountCSClosure;
635 // See the comment for _inc_cset_recorded_rs_lengths_diffs. 565 // See the comment for _inc_cset_recorded_rs_lengths_diffs.
636 double _inc_cset_predicted_elapsed_time_ms_diffs; 566 double _inc_cset_predicted_elapsed_time_ms_diffs;
637 567
638 // Stash a pointer to the g1 heap. 568 // Stash a pointer to the g1 heap.
639 G1CollectedHeap* _g1; 569 G1CollectedHeap* _g1;
570
571 G1GCPhaseTimes* _phase_times;
640 572
641 // The ratio of gc time to elapsed time, computed over recent pauses. 573 // The ratio of gc time to elapsed time, computed over recent pauses.
642 double _recent_avg_pause_time_ratio; 574 double _recent_avg_pause_time_ratio;
643 575
644 double recent_avg_pause_time_ratio() { 576 double recent_avg_pause_time_ratio() {
675 // This set of variables tracks the collector efficiency, in order to 607 // This set of variables tracks the collector efficiency, in order to
676 // determine whether we should initiate a new marking. 608 // determine whether we should initiate a new marking.
677 double _cur_mark_stop_world_time_ms; 609 double _cur_mark_stop_world_time_ms;
678 double _mark_remark_start_sec; 610 double _mark_remark_start_sec;
679 double _mark_cleanup_start_sec; 611 double _mark_cleanup_start_sec;
680 double _root_region_scan_wait_time_ms;
681 612
682 // Update the young list target length either by setting it to the 613 // Update the young list target length either by setting it to the
683 // desired fixed value or by calculating it using G1's pause 614 // desired fixed value or by calculating it using G1's pause
684 // prediction model. If no rs_lengths parameter is passed, predict 615 // prediction model. If no rs_lengths parameter is passed, predict
685 // the RS lengths using the prediction model, otherwise use the 616 // the RS lengths using the prediction model, otherwise use the
726 657
727 virtual CollectorPolicy::Name kind() { 658 virtual CollectorPolicy::Name kind() {
728 return CollectorPolicy::G1CollectorPolicyKind; 659 return CollectorPolicy::G1CollectorPolicyKind;
729 } 660 }
730 661
662 G1GCPhaseTimes* phase_times() const { return _phase_times; }
663
731 // Check the current value of the young list RSet lengths and 664 // Check the current value of the young list RSet lengths and
732 // compare it against the last prediction. If the current value is 665 // compare it against the last prediction. If the current value is
733 // higher, recalculate the young list target length prediction. 666 // higher, recalculate the young list target length prediction.
734 void revise_young_list_target_length_if_necessary(); 667 void revise_young_list_target_length_if_necessary();
735 668
770 703
771 // Must currently be called while the world is stopped. 704 // Must currently be called while the world is stopped.
772 void record_concurrent_mark_init_end(double 705 void record_concurrent_mark_init_end(double
773 mark_init_elapsed_time_ms); 706 mark_init_elapsed_time_ms);
774 707
775 void record_root_region_scan_wait_time(double time_ms) {
776 _root_region_scan_wait_time_ms = time_ms;
777 }
778
779 void record_concurrent_mark_remark_start(); 708 void record_concurrent_mark_remark_start();
780 void record_concurrent_mark_remark_end(); 709 void record_concurrent_mark_remark_end();
781 710
782 void record_concurrent_mark_cleanup_start(); 711 void record_concurrent_mark_cleanup_start();
783 void record_concurrent_mark_cleanup_end(int no_of_gc_threads); 712 void record_concurrent_mark_cleanup_end(int no_of_gc_threads);
784 void record_concurrent_mark_cleanup_completed(); 713 void record_concurrent_mark_cleanup_completed();
785 714
786 void record_concurrent_pause(); 715 void record_concurrent_pause();
787 void record_concurrent_pause_end(); 716
788 717 void record_collection_pause_end(double pause_time);
789 void record_collection_pause_end(int no_of_gc_threads);
790 void print_heap_transition(); 718 void print_heap_transition();
791 719
792 // Record the fact that a full collection occurred. 720 // Record the fact that a full collection occurred.
793 void record_full_collection_start(); 721 void record_full_collection_start();
794 void record_full_collection_end(); 722 void record_full_collection_end();
795
796 void record_gc_worker_start_time(int worker_i, double ms) {
797 _par_last_gc_worker_start_times_ms[worker_i] = ms;
798 }
799
800 void record_ext_root_scan_time(int worker_i, double ms) {
801 _par_last_ext_root_scan_times_ms[worker_i] = ms;
802 }
803
804 void record_satb_filtering_time(int worker_i, double ms) {
805 _par_last_satb_filtering_times_ms[worker_i] = ms;
806 }
807
808 void record_update_rs_time(int thread, double ms) {
809 _par_last_update_rs_times_ms[thread] = ms;
810 }
811
812 void record_update_rs_processed_buffers (int thread,
813 double processed_buffers) {
814 _par_last_update_rs_processed_buffers[thread] = processed_buffers;
815 }
816
817 void record_scan_rs_time(int thread, double ms) {
818 _par_last_scan_rs_times_ms[thread] = ms;
819 }
820
821 void reset_obj_copy_time(int thread) {
822 _par_last_obj_copy_times_ms[thread] = 0.0;
823 }
824
825 void reset_obj_copy_time() {
826 reset_obj_copy_time(0);
827 }
828
829 void record_obj_copy_time(int thread, double ms) {
830 _par_last_obj_copy_times_ms[thread] += ms;
831 }
832
833 void record_termination(int thread, double ms, size_t attempts) {
834 _par_last_termination_times_ms[thread] = ms;
835 _par_last_termination_attempts[thread] = (double) attempts;
836 }
837
838 void record_gc_worker_end_time(int worker_i, double ms) {
839 _par_last_gc_worker_end_times_ms[worker_i] = ms;
840 }
841
842 void record_pause_time_ms(double ms) {
843 _last_pause_time_ms = ms;
844 }
845
846 void record_clear_ct_time(double ms) {
847 _cur_clear_ct_time_ms = ms;
848 }
849
850 void record_par_time(double ms) {
851 _cur_collection_par_time_ms = ms;
852 }
853
854 void record_code_root_fixup_time(double ms) {
855 _cur_collection_code_root_fixup_time_ms = ms;
856 }
857
858 void record_ref_proc_time(double ms) {
859 _cur_ref_proc_time_ms = ms;
860 }
861
862 void record_ref_enq_time(double ms) {
863 _cur_ref_enq_time_ms = ms;
864 }
865
866 #ifndef PRODUCT
867 void record_cc_clear_time(double ms) {
868 if (_min_clear_cc_time_ms < 0.0 || ms <= _min_clear_cc_time_ms)
869 _min_clear_cc_time_ms = ms;
870 if (_max_clear_cc_time_ms < 0.0 || ms >= _max_clear_cc_time_ms)
871 _max_clear_cc_time_ms = ms;
872 _cur_clear_cc_time_ms = ms;
873 _cum_clear_cc_time_ms += ms;
874 _num_cc_clears++;
875 }
876 #endif
877 723
878 // Record how much space we copied during a GC. This is typically 724 // Record how much space we copied during a GC. This is typically
879 // called when a GC alloc region is being retired. 725 // called when a GC alloc region is being retired.
880 void record_bytes_copied_during_gc(size_t bytes) { 726 void record_bytes_copied_during_gc(size_t bytes) {
881 _bytes_copied_during_gc += bytes; 727 _bytes_copied_during_gc += bytes;