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; |
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; |
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 |
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; |