< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahPhaseTimings.hpp

Print this page

  1 /*
  2  * Copyright (c) 2017, 2021, Red Hat, Inc. 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  *

 27 
 28 #include "jfr/jfrEvents.hpp"
 29 #include "gc/shenandoah/shenandoahNumberSeq.hpp"
 30 #include "gc/shared/workerDataArray.hpp"
 31 #include "memory/allocation.hpp"
 32 
 33 class ShenandoahCollectorPolicy;
 34 class outputStream;
 35 
 36 #define SHENANDOAH_PAR_PHASE_DO(CNT_PREFIX, DESC_PREFIX, f)                            \
 37   f(CNT_PREFIX ## TotalWork,                DESC_PREFIX "<total>")                     \
 38   f(CNT_PREFIX ## ThreadRoots,              DESC_PREFIX "Thread Roots")                \
 39   f(CNT_PREFIX ## CodeCacheRoots,           DESC_PREFIX "Code Cache Roots")            \
 40   f(CNT_PREFIX ## VMStrongRoots,            DESC_PREFIX "VM Strong Roots")             \
 41   f(CNT_PREFIX ## VMWeakRoots,              DESC_PREFIX "VM Weak Roots")               \
 42   f(CNT_PREFIX ## CLDGRoots,                DESC_PREFIX "CLDG Roots")                  \
 43   f(CNT_PREFIX ## CodeCacheUnload,          DESC_PREFIX "Unload Code Caches")          \
 44   f(CNT_PREFIX ## CLDUnlink,                DESC_PREFIX "Unlink CLDs")                 \
 45   f(CNT_PREFIX ## WeakRefProc,              DESC_PREFIX "Weak References")             \
 46   f(CNT_PREFIX ## ParallelMark,             DESC_PREFIX "Parallel Mark")               \

 47   // end
 48 
 49 #define SHENANDOAH_PHASE_DO(f)                                                         \
 50   f(conc_reset,                                     "Concurrent Reset")                \
 51                                                                                        \

 52   f(init_mark_gross,                                "Pause Init Mark (G)")             \
 53   f(init_mark,                                      "Pause Init Mark (N)")             \

 54   f(init_manage_tlabs,                              "  Manage TLABs")                  \


 55   f(init_update_region_states,                      "  Update Region States")          \




 56                                                                                        \
 57   f(conc_mark_roots,                                "Concurrent Mark Roots ")          \
 58   SHENANDOAH_PAR_PHASE_DO(conc_mark_roots,          "  CMR: ", f)                      \
 59   f(conc_mark,                                      "Concurrent Marking")              \


 60                                                                                        \
 61   f(final_mark_gross,                               "Pause Final Mark (G)")            \
 62   f(final_mark,                                     "Pause Final Mark (N)")            \

 63   f(finish_mark,                                    "  Finish Mark")                   \

 64   SHENANDOAH_PAR_PHASE_DO(finish_mark_,             "    FM: ", f)                     \
 65   f(purge,                                          "  System Purge")                  \
 66   SHENANDOAH_PAR_PHASE_DO(purge_cu_par_,            "      CU: ", f)                   \
 67   f(purge_weak_par,                                 "    Weak Roots")                  \
 68   SHENANDOAH_PAR_PHASE_DO(purge_weak_par_,          "      WR: ", f)                   \
 69   f(final_update_region_states,                     "  Update Region States")          \
 70   f(final_manage_labs,                              "  Manage GC/TLABs")               \
 71   f(choose_cset,                                    "  Choose Collection Set")         \
 72   f(final_rebuild_freeset,                          "  Rebuild Free Set")              \
 73   f(init_evac,                                      "  Initial Evacuation")            \
 74   SHENANDOAH_PAR_PHASE_DO(evac_,                    "    E: ", f)                      \
 75                                                                                        \
 76   f(conc_thread_roots,                              "Concurrent Thread Roots")         \
 77   SHENANDOAH_PAR_PHASE_DO(conc_thread_roots_,       "  CTR: ", f)                      \
 78   f(conc_weak_refs,                                 "Concurrent Weak References")      \
 79   SHENANDOAH_PAR_PHASE_DO(conc_weak_refs_,          "  CWRF: ", f)                     \
 80   f(conc_weak_roots,                                "Concurrent Weak Roots")           \
 81   f(conc_weak_roots_work,                           "  Roots")                         \
 82   SHENANDOAH_PAR_PHASE_DO(conc_weak_roots_work_,    "    CWR: ", f)                    \
 83   f(conc_weak_roots_rendezvous,                     "  Rendezvous")                    \
 84   f(conc_cleanup_early,                             "Concurrent Cleanup")              \
 85   f(conc_class_unload,                              "Concurrent Class Unloading")      \
 86   f(conc_class_unload_unlink,                       "  Unlink Stale")                  \
 87   f(conc_class_unload_unlink_sd,                    "    System Dictionary")           \
 88   f(conc_class_unload_unlink_weak_klass,            "    Weak Class Links")            \
 89   f(conc_class_unload_unlink_code_roots,            "    Code Roots")                  \
 90   f(conc_class_unload_rendezvous,                   "  Rendezvous")                    \
 91   f(conc_class_unload_purge,                        "  Purge Unlinked")                \
 92   f(conc_class_unload_purge_coderoots,              "    Code Roots")                  \
 93   f(conc_class_unload_purge_cldg,                   "    CLDG")                        \
 94   f(conc_class_unload_purge_ec,                     "    Exception Caches")            \
 95   f(conc_strong_roots,                              "Concurrent Strong Roots")         \
 96   SHENANDOAH_PAR_PHASE_DO(conc_strong_roots_,       "  CSR: ", f)                      \
 97   f(conc_evac,                                      "Concurrent Evacuation")           \
 98                                                                                        \
 99   f(final_roots_gross,                              "Pause Final Roots (G)")           \
100   f(final_roots,                                    "Pause Final Roots (N)")           \

101                                                                                        \
102   f(init_update_refs_gross,                         "Pause Init Update Refs (G)")      \
103   f(init_update_refs,                               "Pause Init Update Refs (N)")      \
104   f(init_update_refs_manage_gclabs,                 "  Manage GCLABs")                 \
105                                                                                        \

106   f(conc_update_refs,                               "Concurrent Update Refs")          \
107   f(conc_update_thread_roots,                       "Concurrent Update Thread Roots")  \
108                                                                                        \
109   f(final_update_refs_gross,                        "Pause Final Update Refs (G)")     \
110   f(final_update_refs,                              "Pause Final Update Refs (N)")     \
111   f(final_update_refs_finish_work,                  "  Finish Work")                   \
112   f(final_update_refs_update_region_states,         "  Update Region States")          \
113   f(final_update_refs_trash_cset,                   "  Trash Collection Set")          \
114   f(final_update_refs_rebuild_freeset,              "  Rebuild Free Set")              \

115                                                                                        \
116   f(conc_cleanup_complete,                          "Concurrent Cleanup")              \


117                                                                                        \
118   f(degen_gc_gross,                                 "Pause Degenerated GC (G)")        \
119   f(degen_gc,                                       "Pause Degenerated GC (N)")        \
120   f(degen_gc_stw_mark,                              "  Degen STW Mark")                \
121   SHENANDOAH_PAR_PHASE_DO(degen_gc_stw_mark_,       "    DSM: ", f)                    \
122   f(degen_gc_mark,                                  "  Degen Mark")                    \
123   SHENANDOAH_PAR_PHASE_DO(degen_gc_mark_,           "    DM: ", f)                     \
124   f(degen_gc_purge,                                 "    System Purge")                \
125   f(degen_gc_weakrefs,                              "      Weak References")           \
126   SHENANDOAH_PAR_PHASE_DO(degen_gc_weakrefs_p_,     "        WRP: ", f)                \
127   f(degen_gc_purge_class_unload,                    "      Unload Classes")            \
128   SHENANDOAH_PAR_PHASE_DO(degen_gc_purge_cu_par_,   "        DCU: ", f)                \
129   f(degen_gc_purge_weak_par,                        "      Weak Roots")                \
130   SHENANDOAH_PAR_PHASE_DO(degen_gc_purge_weak_p_,   "        DWR: ", f)                \
131   f(degen_gc_purge_cldg,                            "      CLDG")                      \
132   f(degen_gc_final_update_region_states,            "  Update Region States")          \
133   f(degen_gc_final_manage_labs,                     "  Manage GC/TLABs")               \
134   f(degen_gc_choose_cset,                           "  Choose Collection Set")         \
135   f(degen_gc_final_rebuild_freeset,                 "  Rebuild Free Set")              \
136   f(degen_gc_stw_evac,                              "  Evacuation")                    \
137   f(degen_gc_init_update_refs_manage_gclabs,        "  Manage GCLABs")                 \
138   f(degen_gc_updaterefs,                            "  Update References")             \
139   f(degen_gc_final_update_refs_finish_work,         "  Finish Work")                   \
140   f(degen_gc_final_update_refs_update_region_states,"  Update Region States")          \
141   f(degen_gc_final_update_refs_trash_cset,          "  Trash Collection Set")          \
142   f(degen_gc_final_update_refs_rebuild_freeset,     "  Rebuild Free Set")              \
143   f(degen_gc_update_roots,                          "  Degen Update Roots")            \
144   SHENANDOAH_PAR_PHASE_DO(degen_gc_update_,         "    DU: ", f)                     \
145   f(degen_gc_cleanup_complete,                      "  Cleanup")                       \




146                                                                                        \
147   f(full_gc_gross,                                  "Pause Full GC (G)")               \
148   f(full_gc,                                        "Pause Full GC (N)")               \
149   f(full_gc_heapdump_pre,                           "  Pre Heap Dump")                 \
150   f(full_gc_prepare,                                "  Prepare")                       \
151   f(full_gc_update_roots,                           "    Update Roots")                \
152   SHENANDOAH_PAR_PHASE_DO(full_gc_update_roots_,    "      FU: ", f)                   \
153   f(full_gc_mark,                                   "  Mark")                          \
154   SHENANDOAH_PAR_PHASE_DO(full_gc_mark_,            "    FM: ", f)                     \
155   f(full_gc_purge,                                  "    System Purge")                \
156   f(full_gc_weakrefs,                               "      Weak References")           \
157   SHENANDOAH_PAR_PHASE_DO(full_gc_weakrefs_p_,      "        WRP: ", f)                \
158   f(full_gc_purge_class_unload,                     "      Unload Classes")            \
159   SHENANDOAH_PAR_PHASE_DO(full_gc_purge_cu_par_,    "        CU: ", f)                 \
160   f(full_gc_purge_weak_par,                         "      Weak Roots")                \
161   SHENANDOAH_PAR_PHASE_DO(full_gc_purge_weak_p_,    "        WR: ", f)                 \
162   f(full_gc_purge_cldg,                             "      CLDG")                      \
163   f(full_gc_calculate_addresses,                    "  Calculate Addresses")           \
164   f(full_gc_calculate_addresses_regular,            "    Regular Objects")             \
165   f(full_gc_calculate_addresses_humong,             "    Humongous Objects")           \
166   f(full_gc_adjust_pointers,                        "  Adjust Pointers")               \
167   f(full_gc_adjust_roots,                           "  Adjust Roots")                  \
168   SHENANDOAH_PAR_PHASE_DO(full_gc_adjust_roots_,    "    FA: ", f)                     \
169   f(full_gc_copy_objects,                           "  Copy Objects")                  \
170   f(full_gc_copy_objects_regular,                   "    Regular Objects")             \
171   f(full_gc_copy_objects_humong,                    "    Humongous Objects")           \

172   f(full_gc_copy_objects_reset_complete,            "    Reset Complete Bitmap")       \
173   f(full_gc_copy_objects_rebuild,                   "    Rebuild Region Sets")         \

174   f(full_gc_heapdump_post,                          "  Post Heap Dump")                \

175                                                                                        \
176   f(conc_uncommit,                                  "Concurrent Uncommit")             \
177   f(pacing,                                         "Pacing")                          \
178                                                                                        \
179   f(heap_iteration_roots,                           "Heap Iteration")                  \
180   SHENANDOAH_PAR_PHASE_DO(heap_iteration_roots_,    "  HI: ", f)                       \
181   // end
182 
183 typedef WorkerDataArray<double> ShenandoahWorkerData;
184 
185 class ShenandoahPhaseTimings : public CHeapObj<mtGC> {
186   friend class ShenandoahGCPhase;
187   friend class ShenandoahWorkerTimingsTracker;
188 public:
189 #define SHENANDOAH_PHASE_DECLARE_ENUM(type, title)   type,
190 
191   enum Phase {
192     SHENANDOAH_PHASE_DO(SHENANDOAH_PHASE_DECLARE_ENUM)
193     _num_phases,
194     _invalid_phase = _num_phases
195   };
196 

199     _num_par_phases
200   };
201 
202 #undef SHENANDOAH_PHASE_DECLARE_ENUM
203 
204 private:
205   uint                _max_workers;
206   double              _cycle_data[_num_phases];
207   HdrSeq              _global_data[_num_phases];
208   static const char*  _phase_names[_num_phases];
209 
210   ShenandoahWorkerData* _worker_data[_num_phases];
211   ShenandoahCollectorPolicy* _policy;
212 
213   static bool is_worker_phase(Phase phase);
214   static bool is_root_work_phase(Phase phase);
215 
216   ShenandoahWorkerData* worker_data(Phase phase, ParPhase par_phase);
217   Phase worker_par_phase(Phase phase, ParPhase par_phase);
218 
219   void set_cycle_data(Phase phase, double time);
220   static double uninitialized() { return -1; }
221 
222 public:
223   ShenandoahPhaseTimings(uint max_workers);
224 
225   void record_phase_time(Phase phase, double time);
226 
227   void record_workers_start(Phase phase);
228   void record_workers_end(Phase phase);
229 
230   void flush_par_workers_to_cycle();
231   void flush_cycle_to_global();
232 
233   static const char* phase_name(Phase phase) {
234     assert(phase >= 0 && phase < _num_phases, "Out of bound");
235     return _phase_names[phase];
236   }
237 
238   void print_cycle_on(outputStream* out) const;
239   void print_global_on(outputStream* out) const;
240 };
241 
242 class ShenandoahWorkerTimingsTracker : public StackObj {
243 private:
244   ShenandoahPhaseTimings*          const _timings;
245   ShenandoahPhaseTimings::Phase    const _phase;
246   ShenandoahPhaseTimings::ParPhase const _par_phase;
247   uint const _worker_id;
248 
249   double _start_time;
250   EventGCPhaseParallel _event;
251 public:
252   ShenandoahWorkerTimingsTracker(ShenandoahPhaseTimings::Phase phase, ShenandoahPhaseTimings::ParPhase par_phase, uint worker_id);



253   ~ShenandoahWorkerTimingsTracker();
254 };
255 
256 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHPHASETIMINGS_HPP

  1 /*
  2  * Copyright (c) 2017, 2021, Red Hat, Inc. All rights reserved.
  3  * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
  4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  5  *
  6  * This code is free software; you can redistribute it and/or modify it
  7  * under the terms of the GNU General Public License version 2 only, as
  8  * published by the Free Software Foundation.
  9  *
 10  * This code is distributed in the hope that it will be useful, but WITHOUT
 11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 13  * version 2 for more details (a copy is included in the LICENSE file that
 14  * accompanied this code).
 15  *
 16  * You should have received a copy of the GNU General Public License version
 17  * 2 along with this work; if not, write to the Free Software Foundation,
 18  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 19  *
 20  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 21  * or visit www.oracle.com if you need additional information or have any
 22  * questions.
 23  *

 28 
 29 #include "jfr/jfrEvents.hpp"
 30 #include "gc/shenandoah/shenandoahNumberSeq.hpp"
 31 #include "gc/shared/workerDataArray.hpp"
 32 #include "memory/allocation.hpp"
 33 
 34 class ShenandoahCollectorPolicy;
 35 class outputStream;
 36 
 37 #define SHENANDOAH_PAR_PHASE_DO(CNT_PREFIX, DESC_PREFIX, f)                            \
 38   f(CNT_PREFIX ## TotalWork,                DESC_PREFIX "<total>")                     \
 39   f(CNT_PREFIX ## ThreadRoots,              DESC_PREFIX "Thread Roots")                \
 40   f(CNT_PREFIX ## CodeCacheRoots,           DESC_PREFIX "Code Cache Roots")            \
 41   f(CNT_PREFIX ## VMStrongRoots,            DESC_PREFIX "VM Strong Roots")             \
 42   f(CNT_PREFIX ## VMWeakRoots,              DESC_PREFIX "VM Weak Roots")               \
 43   f(CNT_PREFIX ## CLDGRoots,                DESC_PREFIX "CLDG Roots")                  \
 44   f(CNT_PREFIX ## CodeCacheUnload,          DESC_PREFIX "Unload Code Caches")          \
 45   f(CNT_PREFIX ## CLDUnlink,                DESC_PREFIX "Unlink CLDs")                 \
 46   f(CNT_PREFIX ## WeakRefProc,              DESC_PREFIX "Weak References")             \
 47   f(CNT_PREFIX ## ParallelMark,             DESC_PREFIX "Parallel Mark")               \
 48   f(CNT_PREFIX ## ScanClusters,             DESC_PREFIX "Scan Clusters")               \
 49   // end
 50 
 51 #define SHENANDOAH_PHASE_DO(f)                                                         \
 52   f(conc_reset,                                     "Concurrent Reset")                \
 53   f(conc_reset_after_collect,                       "Concurrent Reset After Collect")  \
 54   f(conc_reset_old,                                 "Concurrent Reset (OLD)")          \
 55   f(init_mark_gross,                                "Pause Init Mark (G)")             \
 56   f(init_mark,                                      "Pause Init Mark (N)")             \
 57   f(init_mark_verify,                               "  Verify")                        \
 58   f(init_manage_tlabs,                              "  Manage TLABs")                  \
 59   f(init_swap_rset,                                 "  Swap Remembered Set")           \
 60   f(init_transfer_satb,                             "  Transfer Old From SATB")        \
 61   f(init_update_region_states,                      "  Update Region States")          \
 62   f(init_propagate_gc_state,                        "  Propagate GC State")            \
 63                                                                                        \
 64   f(init_scan_rset,                                 "Concurrent Scan Remembered Set")  \
 65   SHENANDOAH_PAR_PHASE_DO(init_scan_rset_,          "  RS: ", f)                       \
 66                                                                                        \
 67   f(conc_mark_roots,                                "Concurrent Mark Roots ")          \
 68   SHENANDOAH_PAR_PHASE_DO(conc_mark_roots,          "  CMR: ", f)                      \
 69   f(conc_mark,                                      "Concurrent Marking")              \
 70   SHENANDOAH_PAR_PHASE_DO(conc_mark,                "  CM: ", f)                       \
 71   f(conc_mark_satb_flush,                           "  Flush SATB")                    \
 72                                                                                        \
 73   f(final_mark_gross,                               "Pause Final Mark (G)")            \
 74   f(final_mark,                                     "Pause Final Mark (N)")            \
 75   f(final_mark_verify,                              "  Verify")                        \
 76   f(finish_mark,                                    "  Finish Mark")                   \
 77   f(final_mark_propagate_gc_state,                  "  Propagate GC State")            \
 78   SHENANDOAH_PAR_PHASE_DO(finish_mark_,             "    FM: ", f)                     \
 79   f(purge,                                          "  System Purge")                  \
 80   SHENANDOAH_PAR_PHASE_DO(purge_cu_par_,            "      CU: ", f)                   \
 81   f(purge_weak_par,                                 "    Weak Roots")                  \
 82   SHENANDOAH_PAR_PHASE_DO(purge_weak_par_,          "      WR: ", f)                   \
 83   f(final_update_region_states,                     "  Update Region States")          \
 84   f(final_manage_labs,                              "  Manage GC/TLABs")               \
 85   f(choose_cset,                                    "  Choose Collection Set")         \
 86   f(final_rebuild_freeset,                          "  Rebuild Free Set")              \
 87   f(init_evac,                                      "  Initial Evacuation")            \
 88   SHENANDOAH_PAR_PHASE_DO(evac_,                    "    E: ", f)                      \
 89                                                                                        \
 90   f(conc_thread_roots,                              "Concurrent Thread Roots")         \
 91   SHENANDOAH_PAR_PHASE_DO(conc_thread_roots_,       "  CTR: ", f)                      \
 92   f(conc_weak_refs,                                 "Concurrent Weak References")      \
 93   SHENANDOAH_PAR_PHASE_DO(conc_weak_refs_,          "  CWRF: ", f)                     \
 94   f(conc_weak_roots,                                "Concurrent Weak Roots")           \
 95   f(conc_weak_roots_work,                           "  Roots")                         \
 96   SHENANDOAH_PAR_PHASE_DO(conc_weak_roots_work_,    "    CWR: ", f)                    \
 97   f(conc_weak_roots_rendezvous,                     "  Rendezvous")                    \
 98   f(conc_cleanup_early,                             "Concurrent Cleanup")              \
 99   f(conc_class_unload,                              "Concurrent Class Unloading")      \
100   f(conc_class_unload_unlink,                       "  Unlink Stale")                  \
101   f(conc_class_unload_unlink_sd,                    "    System Dictionary")           \
102   f(conc_class_unload_unlink_weak_klass,            "    Weak Class Links")            \
103   f(conc_class_unload_unlink_code_roots,            "    Code Roots")                  \
104   f(conc_class_unload_rendezvous,                   "  Rendezvous")                    \
105   f(conc_class_unload_purge,                        "  Purge Unlinked")                \
106   f(conc_class_unload_purge_coderoots,              "    Code Roots")                  \
107   f(conc_class_unload_purge_cldg,                   "    CLDG")                        \
108   f(conc_class_unload_purge_ec,                     "    Exception Caches")            \
109   f(conc_strong_roots,                              "Concurrent Strong Roots")         \
110   SHENANDOAH_PAR_PHASE_DO(conc_strong_roots_,       "  CSR: ", f)                      \
111   f(conc_evac,                                      "Concurrent Evacuation")           \
112   f(conc_final_roots,                               "Concurrent Final Roots")          \
113   f(promote_in_place,                               "  Promote Regions")               \
114   f(final_roots_gross,                              "Pause Verify Final Roots (G)")    \
115   f(final_roots,                                    "Pause Verify Final Roots (N)")    \
116                                                                                        \
117   f(init_update_refs_gross,                         "Pause Init Update Refs (G)")      \
118   f(init_update_refs,                               "Pause Init Update Refs (N)")      \
119   f(init_update_refs_verify,                        "  Verify")                        \
120                                                                                        \
121   f(conc_update_refs_prepare,                       "Concurrent Update Refs Prepare")  \
122   f(conc_update_refs,                               "Concurrent Update Refs")          \
123   f(conc_update_thread_roots,                       "Concurrent Update Thread Roots")  \
124                                                                                        \
125   f(final_update_refs_gross,                        "Pause Final Update Refs (G)")     \
126   f(final_update_refs,                              "Pause Final Update Refs (N)")     \
127   f(final_update_refs_verify,                       "  Verify")                        \
128   f(final_update_refs_update_region_states,         "  Update Region States")          \
129   f(final_update_refs_trash_cset,                   "  Trash Collection Set")          \
130   f(final_update_refs_rebuild_freeset,              "  Rebuild Free Set")              \
131   f(final_update_refs_propagate_gc_state,           "  Propagate GC State")            \
132                                                                                        \
133   f(conc_cleanup_complete,                          "Concurrent Cleanup")              \
134   f(conc_coalesce_and_fill,                         "Concurrent Coalesce and Fill")    \
135   SHENANDOAH_PAR_PHASE_DO(conc_coalesce_,           "  CC&F: ", f)                     \
136                                                                                        \
137   f(degen_gc_gross,                                 "Pause Degenerated GC (G)")        \
138   f(degen_gc,                                       "Pause Degenerated GC (N)")        \
139   f(degen_gc_stw_mark,                              "  Degen STW Mark")                \
140   SHENANDOAH_PAR_PHASE_DO(degen_gc_stw_mark_,       "    DSM: ", f)                    \
141   f(degen_gc_mark,                                  "  Degen Mark")                    \
142   SHENANDOAH_PAR_PHASE_DO(degen_gc_mark_,           "    DM: ", f)                     \
143   f(degen_gc_purge,                                 "    System Purge")                \
144   f(degen_gc_weakrefs,                              "      Weak References")           \
145   SHENANDOAH_PAR_PHASE_DO(degen_gc_weakrefs_p_,     "        WRP: ", f)                \
146   f(degen_gc_purge_class_unload,                    "      Unload Classes")            \
147   SHENANDOAH_PAR_PHASE_DO(degen_gc_purge_cu_par_,   "        DCU: ", f)                \
148   f(degen_gc_purge_weak_par,                        "      Weak Roots")                \
149   SHENANDOAH_PAR_PHASE_DO(degen_gc_purge_weak_p_,   "        DWR: ", f)                \
150   f(degen_gc_purge_cldg,                            "      CLDG")                      \
151   f(degen_gc_final_update_region_states,            "  Update Region States")          \
152   f(degen_gc_final_manage_labs,                     "  Manage GC/TLABs")               \
153   f(degen_gc_choose_cset,                           "  Choose Collection Set")         \
154   f(degen_gc_final_rebuild_freeset,                 "  Rebuild Free Set")              \
155   f(degen_gc_stw_evac,                              "  Evacuation")                    \
156   f(degen_gc_init_update_refs_manage_gclabs,        "  Manage GCLABs")                 \
157   f(degen_gc_update_refs,                           "  Update References")             \

158   f(degen_gc_final_update_refs_update_region_states,"  Update Region States")          \
159   f(degen_gc_final_update_refs_trash_cset,          "  Trash Collection Set")          \
160   f(degen_gc_final_update_refs_rebuild_freeset,     "  Rebuild Free Set")              \
161   f(degen_gc_update_roots,                          "  Degen Update Roots")            \
162   SHENANDOAH_PAR_PHASE_DO(degen_gc_update_,         "    DU: ", f)                     \
163   f(degen_gc_cleanup_complete,                      "  Cleanup")                       \
164   f(degen_gc_promote_regions,                       "  Degen Promote Regions")         \
165   f(degen_gc_coalesce_and_fill,                     "  Degen Coalesce and Fill")       \
166   SHENANDOAH_PAR_PHASE_DO(degen_coalesce_,          "    DC&F", f)                     \
167   f(degen_gc_propagate_gc_state,                    "  Propagate GC State")            \
168                                                                                        \
169   f(full_gc_gross,                                  "Pause Full GC (G)")               \
170   f(full_gc,                                        "Pause Full GC (N)")               \
171   f(full_gc_heapdump_pre,                           "  Pre Heap Dump")                 \
172   f(full_gc_prepare,                                "  Prepare")                       \
173   f(full_gc_update_roots,                           "    Update Roots")                \
174   SHENANDOAH_PAR_PHASE_DO(full_gc_update_roots_,    "      FU: ", f)                   \
175   f(full_gc_mark,                                   "  Mark")                          \
176   SHENANDOAH_PAR_PHASE_DO(full_gc_mark_,            "    FM: ", f)                     \
177   f(full_gc_purge,                                  "    System Purge")                \
178   f(full_gc_weakrefs,                               "      Weak References")           \
179   SHENANDOAH_PAR_PHASE_DO(full_gc_weakrefs_p_,      "        WRP: ", f)                \
180   f(full_gc_purge_class_unload,                     "      Unload Classes")            \
181   SHENANDOAH_PAR_PHASE_DO(full_gc_purge_cu_par_,    "        CU: ", f)                 \
182   f(full_gc_purge_weak_par,                         "      Weak Roots")                \
183   SHENANDOAH_PAR_PHASE_DO(full_gc_purge_weak_p_,    "        WR: ", f)                 \
184   f(full_gc_purge_cldg,                             "      CLDG")                      \
185   f(full_gc_calculate_addresses,                    "  Calculate Addresses")           \
186   f(full_gc_calculate_addresses_regular,            "    Regular Objects")             \
187   f(full_gc_calculate_addresses_humong,             "    Humongous Objects")           \
188   f(full_gc_adjust_pointers,                        "  Adjust Pointers")               \
189   f(full_gc_adjust_roots,                           "  Adjust Roots")                  \
190   SHENANDOAH_PAR_PHASE_DO(full_gc_adjust_roots_,    "    FA: ", f)                     \
191   f(full_gc_copy_objects,                           "  Copy Objects")                  \
192   f(full_gc_copy_objects_regular,                   "    Regular Objects")             \
193   f(full_gc_copy_objects_humong,                    "    Humongous Objects")           \
194   f(full_gc_recompute_generation_usage,             "    Recompute generation usage")  \
195   f(full_gc_copy_objects_reset_complete,            "    Reset Complete Bitmap")       \
196   f(full_gc_copy_objects_rebuild,                   "    Rebuild Region Sets")         \
197   f(full_gc_reconstruct_remembered_set,             "    Reconstruct Remembered Set")  \
198   f(full_gc_heapdump_post,                          "  Post Heap Dump")                \
199   f(full_gc_propagate_gc_state,                     "  Propagate GC State")            \
200                                                                                        \

201   f(pacing,                                         "Pacing")                          \
202                                                                                        \
203   f(heap_iteration_roots,                           "Heap Iteration")                  \
204   SHENANDOAH_PAR_PHASE_DO(heap_iteration_roots_,    "  HI: ", f)                       \
205   // end
206 
207 typedef WorkerDataArray<double> ShenandoahWorkerData;
208 
209 class ShenandoahPhaseTimings : public CHeapObj<mtGC> {
210   friend class ShenandoahGCPhase;
211   friend class ShenandoahWorkerTimingsTracker;
212 public:
213 #define SHENANDOAH_PHASE_DECLARE_ENUM(type, title)   type,
214 
215   enum Phase {
216     SHENANDOAH_PHASE_DO(SHENANDOAH_PHASE_DECLARE_ENUM)
217     _num_phases,
218     _invalid_phase = _num_phases
219   };
220 

223     _num_par_phases
224   };
225 
226 #undef SHENANDOAH_PHASE_DECLARE_ENUM
227 
228 private:
229   uint                _max_workers;
230   double              _cycle_data[_num_phases];
231   HdrSeq              _global_data[_num_phases];
232   static const char*  _phase_names[_num_phases];
233 
234   ShenandoahWorkerData* _worker_data[_num_phases];
235   ShenandoahCollectorPolicy* _policy;
236 
237   static bool is_worker_phase(Phase phase);
238   static bool is_root_work_phase(Phase phase);
239 
240   ShenandoahWorkerData* worker_data(Phase phase, ParPhase par_phase);
241   Phase worker_par_phase(Phase phase, ParPhase par_phase);
242 
243   void set_cycle_data(Phase phase, double time, bool should_aggregate = false);
244   static double uninitialized() { return -1; }
245 
246 public:
247   ShenandoahPhaseTimings(uint max_workers);
248 
249   void record_phase_time(Phase phase, double time, bool should_aggregate = false);
250 
251   void record_workers_start(Phase phase);
252   void record_workers_end(Phase phase);
253 
254   void flush_par_workers_to_cycle();
255   void flush_cycle_to_global();
256 
257   static const char* phase_name(Phase phase) {
258     assert(phase >= 0 && phase < _num_phases, "Out of bound");
259     return _phase_names[phase];
260   }
261 
262   void print_cycle_on(outputStream* out) const;
263   void print_global_on(outputStream* out) const;
264 };
265 
266 class ShenandoahWorkerTimingsTracker : public StackObj {
267 private:
268   ShenandoahPhaseTimings*          const _timings;
269   ShenandoahPhaseTimings::Phase    const _phase;
270   ShenandoahPhaseTimings::ParPhase const _par_phase;
271   uint const _worker_id;
272 
273   double _start_time;
274   EventGCPhaseParallel _event;
275 public:
276   ShenandoahWorkerTimingsTracker(ShenandoahPhaseTimings::Phase phase,
277                                  ShenandoahPhaseTimings::ParPhase par_phase,
278                                  uint worker_id,
279                                  bool cumulative = false);
280   ~ShenandoahWorkerTimingsTracker();
281 };
282 
283 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHPHASETIMINGS_HPP
< prev index next >