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

Mon, 19 Aug 2019 10:11:31 +0200

author
neugens
date
Mon, 19 Aug 2019 10:11:31 +0200
changeset 9861
a248d0be1309
parent 9858
b985cbb00e68
child 9931
fd44df5e3bc3
permissions
-rw-r--r--

8229401: Fix JFR code cache test failures
8223689: Add JFR Thread Sampling Support
8223690: Add JFR BiasedLock Event Support
8223691: Add JFR G1 Region Type Change Event Support
8223692: Add JFR G1 Heap Summary Event Support
Summary: Backport JFR from JDK11, additional fixes
Reviewed-by: neugens, apetushkov
Contributed-by: denghui.ddh@alibaba-inc.com

     1 /*
     2  * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  *
    23  */
    25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP
    26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP
    28 #include "memory/allocation.hpp"
    30 class LineBuffer;
    32 template <class T> class WorkerDataArray;
    34 class G1GCPhaseTimes : public CHeapObj<mtGC> {
    35   friend class G1GCParPhasePrinter;
    37   uint _active_gc_threads;
    38   uint _max_gc_threads;
    40  public:
    41   enum GCParPhases {
    42     GCWorkerStart,
    43     ExtRootScan,
    44     ThreadRoots,
    45     StringTableRoots,
    46     UniverseRoots,
    47     JNIRoots,
    48     ObjectSynchronizerRoots,
    49     FlatProfilerRoots,
    50     ManagementRoots,
    51     SystemDictionaryRoots,
    52     CLDGRoots,
    53     JVMTIRoots,
    54     CodeCacheRoots,
    55     CMRefRoots,
    56     WaitForStrongCLD,
    57     WeakCLDRoots,
    58     SATBFiltering,
    59     UpdateRS,
    60     ScanRS,
    61     CodeRoots,
    62     ObjCopy,
    63     Termination,
    64     Other,
    65     GCWorkerTotal,
    66     GCWorkerEnd,
    67     StringDedupQueueFixup,
    68     StringDedupTableFixup,
    69     RedirtyCards,
    70     GCParPhasesSentinel
    71   };
    73  private:
    74   // Markers for grouping the phases in the GCPhases enum above
    75   static const int GCMainParPhasesLast = GCWorkerEnd;
    76   static const int StringDedupPhasesFirst = StringDedupQueueFixup;
    77   static const int StringDedupPhasesLast = StringDedupTableFixup;
    79   WorkerDataArray<double>* _gc_par_phases[GCParPhasesSentinel];
    80   WorkerDataArray<size_t>* _update_rs_processed_buffers;
    81   WorkerDataArray<size_t>* _termination_attempts;
    82   WorkerDataArray<size_t>* _redirtied_cards;
    84   double _cur_collection_par_time_ms;
    85   double _cur_collection_code_root_fixup_time_ms;
    86   double _cur_strong_code_root_purge_time_ms;
    88   double _cur_evac_fail_recalc_used;
    89   double _cur_evac_fail_restore_remsets;
    90   double _cur_evac_fail_remove_self_forwards;
    92   double _cur_string_dedup_fixup_time_ms;
    94   double _cur_clear_ct_time_ms;
    95   double _cur_ref_proc_time_ms;
    96   double _cur_ref_enq_time_ms;
    98   double _cur_collection_start_sec;
    99   double _root_region_scan_wait_time_ms;
   101   double _recorded_young_cset_choice_time_ms;
   102   double _recorded_non_young_cset_choice_time_ms;
   104   double _recorded_redirty_logged_cards_time_ms;
   106   double _recorded_young_free_cset_time_ms;
   107   double _recorded_non_young_free_cset_time_ms;
   109   double _cur_fast_reclaim_humongous_time_ms;
   110   double _cur_fast_reclaim_humongous_register_time_ms;
   111   size_t _cur_fast_reclaim_humongous_total;
   112   size_t _cur_fast_reclaim_humongous_candidates;
   113   size_t _cur_fast_reclaim_humongous_reclaimed;
   115   double _cur_verify_before_time_ms;
   116   double _cur_verify_after_time_ms;
   118   // Helper methods for detailed logging
   119   void print_stats(int level, const char* str, double value);
   120   void print_stats(int level, const char* str, size_t value);
   121   void print_stats(int level, const char* str, double value, uint workers);
   123  public:
   124   G1GCPhaseTimes(uint max_gc_threads);
   125   void note_gc_start(uint active_gc_threads, bool mark_in_progress);
   126   void note_gc_end();
   127   void print(double pause_time_sec);
   129   // record the time a phase took in seconds
   130   void record_time_secs(GCParPhases phase, uint worker_i, double secs);
   132   // add a number of seconds to a phase
   133   void add_time_secs(GCParPhases phase, uint worker_i, double secs);
   135   void record_thread_work_item(GCParPhases phase, uint worker_i, size_t count);
   137   // return the average time for a phase in milliseconds
   138   double average_time_ms(GCParPhases phase);
   140   size_t sum_thread_work_items(GCParPhases phase);
   142  private:
   143   double get_time_ms(GCParPhases phase, uint worker_i);
   144   double sum_time_ms(GCParPhases phase);
   145   double min_time_ms(GCParPhases phase);
   146   double max_time_ms(GCParPhases phase);
   147   size_t get_thread_work_item(GCParPhases phase, uint worker_i);
   148   double average_thread_work_items(GCParPhases phase);
   149   size_t min_thread_work_items(GCParPhases phase);
   150   size_t max_thread_work_items(GCParPhases phase);
   152  public:
   154   void record_clear_ct_time(double ms) {
   155     _cur_clear_ct_time_ms = ms;
   156   }
   158   void record_par_time(double ms) {
   159     _cur_collection_par_time_ms = ms;
   160   }
   162   void record_code_root_fixup_time(double ms) {
   163     _cur_collection_code_root_fixup_time_ms = ms;
   164   }
   166   void record_strong_code_root_purge_time(double ms) {
   167     _cur_strong_code_root_purge_time_ms = ms;
   168   }
   170   void record_evac_fail_recalc_used_time(double ms) {
   171     _cur_evac_fail_recalc_used = ms;
   172   }
   174   void record_evac_fail_restore_remsets(double ms) {
   175     _cur_evac_fail_restore_remsets = ms;
   176   }
   178   void record_evac_fail_remove_self_forwards(double ms) {
   179     _cur_evac_fail_remove_self_forwards = ms;
   180   }
   182   void record_string_dedup_fixup_time(double ms) {
   183     _cur_string_dedup_fixup_time_ms = ms;
   184   }
   186   void record_ref_proc_time(double ms) {
   187     _cur_ref_proc_time_ms = ms;
   188   }
   190   void record_ref_enq_time(double ms) {
   191     _cur_ref_enq_time_ms = ms;
   192   }
   194   void record_root_region_scan_wait_time(double time_ms) {
   195     _root_region_scan_wait_time_ms = time_ms;
   196   }
   198   void record_young_free_cset_time_ms(double time_ms) {
   199     _recorded_young_free_cset_time_ms = time_ms;
   200   }
   202   void record_non_young_free_cset_time_ms(double time_ms) {
   203     _recorded_non_young_free_cset_time_ms = time_ms;
   204   }
   206   void record_fast_reclaim_humongous_stats(double time_ms, size_t total, size_t candidates) {
   207     _cur_fast_reclaim_humongous_register_time_ms = time_ms;
   208     _cur_fast_reclaim_humongous_total = total;
   209     _cur_fast_reclaim_humongous_candidates = candidates;
   210   }
   212   void record_fast_reclaim_humongous_time_ms(double value, size_t reclaimed) {
   213     _cur_fast_reclaim_humongous_time_ms = value;
   214     _cur_fast_reclaim_humongous_reclaimed = reclaimed;
   215   }
   217   void record_young_cset_choice_time_ms(double time_ms) {
   218     _recorded_young_cset_choice_time_ms = time_ms;
   219   }
   221   void record_non_young_cset_choice_time_ms(double time_ms) {
   222     _recorded_non_young_cset_choice_time_ms = time_ms;
   223   }
   225   void record_redirty_logged_cards_time_ms(double time_ms) {
   226     _recorded_redirty_logged_cards_time_ms = time_ms;
   227   }
   229   void record_cur_collection_start_sec(double time_ms) {
   230     _cur_collection_start_sec = time_ms;
   231   }
   233   void record_verify_before_time_ms(double time_ms) {
   234     _cur_verify_before_time_ms = time_ms;
   235   }
   237   void record_verify_after_time_ms(double time_ms) {
   238     _cur_verify_after_time_ms = time_ms;
   239   }
   241   double accounted_time_ms();
   243   double cur_collection_start_sec() {
   244     return _cur_collection_start_sec;
   245   }
   247   double cur_collection_par_time_ms() {
   248     return _cur_collection_par_time_ms;
   249   }
   251   double cur_clear_ct_time_ms() {
   252     return _cur_clear_ct_time_ms;
   253   }
   255   double root_region_scan_wait_time_ms() {
   256     return _root_region_scan_wait_time_ms;
   257   }
   259   double young_cset_choice_time_ms() {
   260     return _recorded_young_cset_choice_time_ms;
   261   }
   263   double young_free_cset_time_ms() {
   264     return _recorded_young_free_cset_time_ms;
   265   }
   267   double non_young_cset_choice_time_ms() {
   268     return _recorded_non_young_cset_choice_time_ms;
   269   }
   271   double non_young_free_cset_time_ms() {
   272     return _recorded_non_young_free_cset_time_ms;
   273   }
   275   double fast_reclaim_humongous_time_ms() {
   276     return _cur_fast_reclaim_humongous_time_ms;
   277   }
   278 };
   280 class G1GCParPhaseTimesTracker : public StackObj {
   281   Ticks _start_time;
   282   G1GCPhaseTimes::GCParPhases _phase;
   283   G1GCPhaseTimes* _phase_times;
   284   uint _worker_id;
   285 public:
   286   G1GCParPhaseTimesTracker(G1GCPhaseTimes* phase_times, G1GCPhaseTimes::GCParPhases phase, uint worker_id);
   287   ~G1GCParPhaseTimesTracker();
   288 };
   290 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP

mercurial