< prev index next >

src/share/vm/gc_implementation/g1/g1GCPhaseTimes.hpp

Print this page

        

*** 23,79 **** */ #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP #define SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP - #include "memory/allocation.hpp" #include "gc_interface/gcCause.hpp" template <class T> class WorkerDataArray : public CHeapObj<mtGC> { T* _data; uint _length; ! const char* _print_format; bool _print_sum; ! NOT_PRODUCT(static const T _uninitialized;) // We are caching the sum and average to only have to calculate them once. // This is not done in an MT-safe way. It is intended to allow single // threaded code to call sum() and average() multiple times in any order // without having to worry about the cost. bool _has_new_data; T _sum; double _average; public: ! WorkerDataArray(uint length, const char* print_format, bool print_sum = true) : ! _length(length), _print_format(print_format), _print_sum(print_sum), _has_new_data(true) { ! assert(length > 0, "Must have some workers to store data for"); ! _data = NEW_C_HEAP_ARRAY(T, _length, mtGC); ! } ! ~WorkerDataArray() { ! FREE_C_HEAP_ARRAY(T, _data); } void set(uint worker_i, T value) { assert(worker_i < _length, err_msg("Worker %d is greater than max: %d", worker_i, _length)); ! assert(_data[worker_i] == (T)-1, err_msg("Overwriting data for worker %d", worker_i)); _data[worker_i] = value; _has_new_data = true; } T get(uint worker_i) { assert(worker_i < _length, err_msg("Worker %d is greater than max: %d", worker_i, _length)); ! assert(_data[worker_i] != (T)-1, err_msg("No data to add to for worker %d", worker_i)); return _data[worker_i]; } void add(uint worker_i, T value) { assert(worker_i < _length, err_msg("Worker %d is greater than max: %d", worker_i, _length)); ! assert(_data[worker_i] != (T)-1, err_msg("No data to add to for worker %d", worker_i)); _data[worker_i] += value; _has_new_data = true; } double average(){ --- 23,95 ---- */ #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP #define SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP #include "gc_interface/gcCause.hpp" + class LineBuffer; + template <class T> class WorkerDataArray : public CHeapObj<mtGC> { T* _data; uint _length; ! const char* _title; bool _print_sum; + int _log_level; + uint _indent_level; + bool _enabled; + + WorkerDataArray<size_t>* _sub_count; ! NOT_PRODUCT(T uninitialized();) // We are caching the sum and average to only have to calculate them once. // This is not done in an MT-safe way. It is intended to allow single // threaded code to call sum() and average() multiple times in any order // without having to worry about the cost. bool _has_new_data; T _sum; double _average; + void log_value(LineBuffer& buf, T value); + public: ! WorkerDataArray(uint length, const char* title, bool print_sum, int log_level, uint indent_level); ! ~WorkerDataArray(); ! ! void link_sub_count_array(WorkerDataArray<size_t>* sub_count) { ! _sub_count = sub_count; } void set(uint worker_i, T value) { assert(worker_i < _length, err_msg("Worker %d is greater than max: %d", worker_i, _length)); ! assert(_data[worker_i] == WorkerDataArray<T>::uninitialized(), err_msg("Overwriting data for worker %d in %s", worker_i, _title)); _data[worker_i] = value; _has_new_data = true; } + void set_sub_count(uint worker_i, size_t value) { + assert(_sub_count != NULL, "No sub count"); + _sub_count->set(worker_i, value); + } + + size_t sub_count_sum() { + assert(_sub_count != NULL, "No sub count"); + return _sub_count->sum(); + } + T get(uint worker_i) { assert(worker_i < _length, err_msg("Worker %d is greater than max: %d", worker_i, _length)); ! assert(_data[worker_i] != WorkerDataArray<T>::uninitialized(), err_msg("No data to add to for worker %d", worker_i)); return _data[worker_i]; } void add(uint worker_i, T value) { assert(worker_i < _length, err_msg("Worker %d is greater than max: %d", worker_i, _length)); ! assert(_data[worker_i] != WorkerDataArray<T>::uninitialized(), err_msg("No data to add to for worker %d", worker_i)); _data[worker_i] += value; _has_new_data = true; } double average(){
*** 88,102 **** calculate_totals(); } return _sum; } ! void print(int level, const char* title); void reset() PRODUCT_RETURN; void verify() PRODUCT_RETURN; private: void calculate_totals(){ _sum = (T)0; for (uint i = 0; i < _length; ++i) { --- 104,122 ---- calculate_totals(); } return _sum; } ! void print(); void reset() PRODUCT_RETURN; void verify() PRODUCT_RETURN; + void set_enabled(bool enabled) { _enabled = enabled; } + + int log_level() { return _log_level; } + private: void calculate_totals(){ _sum = (T)0; for (uint i = 0; i < _length; ++i) {
*** 106,145 **** _has_new_data = false; } }; class G1GCPhaseTimes : public CHeapObj<mtGC> { - - private: uint _active_gc_threads; uint _max_gc_threads; ! WorkerDataArray<double> _last_gc_worker_start_times_ms; ! WorkerDataArray<double> _last_ext_root_scan_times_ms; ! WorkerDataArray<double> _last_satb_filtering_times_ms; ! WorkerDataArray<double> _last_update_rs_times_ms; ! WorkerDataArray<int> _last_update_rs_processed_buffers; ! WorkerDataArray<double> _last_scan_rs_times_ms; ! WorkerDataArray<double> _last_strong_code_root_scan_times_ms; ! WorkerDataArray<double> _last_obj_copy_times_ms; ! WorkerDataArray<double> _last_termination_times_ms; ! WorkerDataArray<size_t> _last_termination_attempts; ! WorkerDataArray<double> _last_gc_worker_end_times_ms; ! WorkerDataArray<double> _last_gc_worker_times_ms; ! WorkerDataArray<double> _last_gc_worker_other_times_ms; double _cur_collection_par_time_ms; double _cur_collection_code_root_fixup_time_ms; double _cur_strong_code_root_purge_time_ms; double _cur_evac_fail_recalc_used; double _cur_evac_fail_restore_remsets; double _cur_evac_fail_remove_self_forwards; double _cur_string_dedup_fixup_time_ms; - WorkerDataArray<double> _cur_string_dedup_queue_fixup_worker_times_ms; - WorkerDataArray<double> _cur_string_dedup_table_fixup_worker_times_ms; double _cur_clear_ct_time_ms; double _cur_ref_proc_time_ms; double _cur_ref_enq_time_ms; --- 126,177 ---- _has_new_data = false; } }; class G1GCPhaseTimes : public CHeapObj<mtGC> { uint _active_gc_threads; uint _max_gc_threads; ! public: ! enum GCPhases { ! GCWorkerStart, ! ExtRootScan, ! SATBFiltering, ! UpdateRS, ! ScanRS, ! CodeRoots, ! ObjCopy, ! Termination, ! Other, ! GCWorkerTotal, ! GCWorkerEnd, ! StringDedupQueueFixup, ! StringDedupTableFixup, ! RedirtyCards, ! Sentinel ! }; ! ! private: ! // Markers for grouping the phases in the GCPhases enum above ! static const int GCMainPhasesLast = GCWorkerEnd; ! static const int StringDedupPhasesFirst = StringDedupQueueFixup; ! static const int StringDedupPhasesLast = StringDedupTableFixup; ! ! WorkerDataArray<double>* _gc_phases[Sentinel]; ! WorkerDataArray<size_t>* _update_rs_processed_buffers; ! WorkerDataArray<size_t>* _termination_attempts; ! WorkerDataArray<size_t>* _redirtied_cards; double _cur_collection_par_time_ms; double _cur_collection_code_root_fixup_time_ms; double _cur_strong_code_root_purge_time_ms; double _cur_evac_fail_recalc_used; double _cur_evac_fail_restore_remsets; double _cur_evac_fail_remove_self_forwards; double _cur_string_dedup_fixup_time_ms; double _cur_clear_ct_time_ms; double _cur_ref_proc_time_ms; double _cur_ref_enq_time_ms;
*** 147,158 **** double _root_region_scan_wait_time_ms; double _recorded_young_cset_choice_time_ms; double _recorded_non_young_cset_choice_time_ms; - WorkerDataArray<double> _last_redirty_logged_cards_time_ms; - WorkerDataArray<size_t> _last_redirty_logged_cards_processed_cards; double _recorded_redirty_logged_cards_time_ms; double _recorded_young_free_cset_time_ms; double _recorded_non_young_free_cset_time_ms; --- 179,188 ----
*** 170,226 **** void print_stats(int level, const char* str, size_t value); void print_stats(int level, const char* str, double value, uint workers); public: G1GCPhaseTimes(uint max_gc_threads); ! void note_gc_start(uint active_gc_threads); void note_gc_end(); void print(double pause_time_sec); ! void record_gc_worker_start_time(uint worker_i, double ms) { ! _last_gc_worker_start_times_ms.set(worker_i, ms); ! } ! ! void record_ext_root_scan_time(uint worker_i, double ms) { ! _last_ext_root_scan_times_ms.set(worker_i, ms); } ! void record_satb_filtering_time(uint worker_i, double ms) { ! _last_satb_filtering_times_ms.set(worker_i, ms); } ! void record_update_rs_time(uint worker_i, double ms) { ! _last_update_rs_times_ms.set(worker_i, ms); } ! void record_update_rs_processed_buffers(uint worker_i, int processed_buffers) { ! _last_update_rs_processed_buffers.set(worker_i, processed_buffers); } ! void record_scan_rs_time(uint worker_i, double ms) { ! _last_scan_rs_times_ms.set(worker_i, ms); ! } ! ! void record_strong_code_root_scan_time(uint worker_i, double ms) { ! _last_strong_code_root_scan_times_ms.set(worker_i, ms); ! } ! ! void record_obj_copy_time(uint worker_i, double ms) { ! _last_obj_copy_times_ms.set(worker_i, ms); ! } ! ! void add_obj_copy_time(uint worker_i, double ms) { ! _last_obj_copy_times_ms.add(worker_i, ms); ! } ! ! void record_termination(uint worker_i, double ms, size_t attempts) { ! _last_termination_times_ms.set(worker_i, ms); ! _last_termination_attempts.set(worker_i, attempts); ! } ! ! void record_gc_worker_end_time(uint worker_i, double ms) { ! _last_gc_worker_end_times_ms.set(worker_i, ms); } void record_clear_ct_time(double ms) { _cur_clear_ct_time_ms = ms; } --- 200,231 ---- void print_stats(int level, const char* str, size_t value); void print_stats(int level, const char* str, double value, uint workers); public: G1GCPhaseTimes(uint max_gc_threads); ! void note_gc_start(uint active_gc_threads, bool mark_in_progress); void note_gc_end(); void print(double pause_time_sec); ! void record_time(GCPhases phase, uint worker_i, double time) { ! _gc_phases[phase]->set(worker_i, time); } ! void add_time(GCPhases phase, uint worker_i, double time) { ! _gc_phases[phase]->add(worker_i, time); } ! void record_sub_count(GCPhases phase, uint worker_i, size_t count) { ! _gc_phases[phase]->set_sub_count(worker_i, count); } ! double average_time(GCPhases phase) { ! return _gc_phases[phase]->average(); } ! size_t sub_count_sum(GCPhases phase) { ! return _gc_phases[phase]->sub_count_sum(); } void record_clear_ct_time(double ms) { _cur_clear_ct_time_ms = ms; }
*** 247,271 **** void record_evac_fail_remove_self_forwards(double ms) { _cur_evac_fail_remove_self_forwards = ms; } - void note_string_dedup_fixup_start(); - void note_string_dedup_fixup_end(); - void record_string_dedup_fixup_time(double ms) { _cur_string_dedup_fixup_time_ms = ms; } - void record_string_dedup_queue_fixup_worker_time(uint worker_id, double ms) { - _cur_string_dedup_queue_fixup_worker_times_ms.set(worker_id, ms); - } - - void record_string_dedup_table_fixup_worker_time(uint worker_id, double ms) { - _cur_string_dedup_table_fixup_worker_times_ms.set(worker_id, ms); - } - void record_ref_proc_time(double ms) { _cur_ref_proc_time_ms = ms; } void record_ref_enq_time(double ms) { --- 252,265 ----
*** 301,318 **** void record_non_young_cset_choice_time_ms(double time_ms) { _recorded_non_young_cset_choice_time_ms = time_ms; } - void record_redirty_logged_cards_time_ms(uint worker_i, double time_ms) { - _last_redirty_logged_cards_time_ms.set(worker_i, time_ms); - } - - void record_redirty_logged_cards_processed_cards(uint worker_i, size_t processed_buffers) { - _last_redirty_logged_cards_processed_cards.set(worker_i, processed_buffers); - } - void record_redirty_logged_cards_time_ms(double time_ms) { _recorded_redirty_logged_cards_time_ms = time_ms; } void record_cur_collection_start_sec(double time_ms) { --- 295,304 ----
*** 362,401 **** } double fast_reclaim_humongous_time_ms() { return _cur_fast_reclaim_humongous_time_ms; } ! double average_last_update_rs_time() { ! return _last_update_rs_times_ms.average(); ! } ! ! int sum_last_update_rs_processed_buffers() { ! return _last_update_rs_processed_buffers.sum(); ! } ! ! double average_last_scan_rs_time(){ ! return _last_scan_rs_times_ms.average(); ! } ! ! double average_last_strong_code_root_scan_time(){ ! return _last_strong_code_root_scan_times_ms.average(); ! } ! ! double average_last_obj_copy_time() { ! return _last_obj_copy_times_ms.average(); ! } ! ! double average_last_termination_time() { ! return _last_termination_times_ms.average(); ! } ! ! double average_last_ext_root_scan_time() { ! return _last_ext_root_scan_times_ms.average(); ! } ! ! double average_last_satb_filtering_times_ms() { ! return _last_satb_filtering_times_ms.average(); ! } }; #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP --- 348,365 ---- } double fast_reclaim_humongous_time_ms() { return _cur_fast_reclaim_humongous_time_ms; } + }; ! class G1GCPhaseTimesTracker : public StackObj { ! double _start_time; ! G1GCPhaseTimes::GCPhases _phase; ! G1GCPhaseTimes* _phase_times; ! uint _worker_id; ! public: ! G1GCPhaseTimesTracker(G1GCPhaseTimes* phase_times, G1GCPhaseTimes::GCPhases phase, uint worker_id); ! ~G1GCPhaseTimesTracker(); }; #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP
< prev index next >