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  *
 24  */
 25 
 26 #ifndef SHARE_GC_SHENANDOAH_SHENANDOAHPHASETIMINGS_HPP
 27 #define SHARE_GC_SHENANDOAH_SHENANDOAHPHASETIMINGS_HPP
 28 
 29 #include "gc/shared/workerDataArray.hpp"
 30 #include "gc/shenandoah/shenandoahNumberSeq.hpp"
 31 #include "jfr/jfrEvents.hpp"
 32 #include "memory/allocation.hpp"
 33 
 34 class ShenandoahCollectorPolicy;
 35 class outputStream;
 36 
 37 #define SHENANDOAH_WORKER_PHASE_DO(NAME_PREFIX, DESC_PREFIX, f)             \
 38   f(NAME_PREFIX ## Work,                 DESC_PREFIX "Work",        false)  \
 39   f(NAME_PREFIX ## Threads,              DESC_PREFIX "Threads",     false)  \
 40   f(NAME_PREFIX ## CodeCache,            DESC_PREFIX "Code Cache",  false)  \
 41   f(NAME_PREFIX ## VMStrongs,            DESC_PREFIX "VM Strongs",  false)  \
 42   f(NAME_PREFIX ## VMWeaks,              DESC_PREFIX "VM Weaks",    false)  \
 43   f(NAME_PREFIX ## Classes,              DESC_PREFIX "Classes",     false)  \
 44   // END
 45 
 46 #define SHENANDOAH_SIMPLE_PHASE_DEF(f, NAME, DESC)    \
 47   f(NAME, DESC, false)
 48 
 49 #define SHENANDOAH_WORKER_PHASE_DEF(f, NAME_PREFIX, MAIN_DESC, DESC_PREFIX)    \
 50   f(NAME_PREFIX, MAIN_DESC, true)                                              \
 51   SHENANDOAH_WORKER_PHASE_DO(NAME_PREFIX, DESC_PREFIX, f)
 52 
 53 #define SHENANDOAH_PHASE_DO(f)                                                                                       \
 54   SHENANDOAH_SIMPLE_PHASE_DEF(f, conc_gc,                                         "Concurrent GC")                   \
 55   SHENANDOAH_SIMPLE_PHASE_DEF(f, conc_reset,                                      "Concurrent Reset")                \
 56   SHENANDOAH_SIMPLE_PHASE_DEF(f, init_mark_gross,                                 "Pause Init Mark (G)")             \
 57   SHENANDOAH_SIMPLE_PHASE_DEF(f, init_mark,                                       "Pause Init Mark (N)")             \
 58   SHENANDOAH_SIMPLE_PHASE_DEF(f, init_mark_verify,                                "  Verify")                        \
 59   SHENANDOAH_SIMPLE_PHASE_DEF(f, init_manage_tlabs,                               "  Manage TLABs")                  \
 60   SHENANDOAH_SIMPLE_PHASE_DEF(f, init_swap_rset,                                  "  Swap Remembered Set")           \
 61   SHENANDOAH_SIMPLE_PHASE_DEF(f, init_transfer_satb,                              "  Transfer Old From SATB")        \
 62   SHENANDOAH_SIMPLE_PHASE_DEF(f, init_update_region_states,                       "  Update Region States")          \
 63   SHENANDOAH_SIMPLE_PHASE_DEF(f, init_propagate_gc_state,                         "  Propagate GC State")            \
 64   SHENANDOAH_WORKER_PHASE_DEF(f, init_scan_rset,                                  "Concurrent Scan Remembered Set",  \
 65                                                                                   "  RS: ")                          \
 66   SHENANDOAH_WORKER_PHASE_DEF(f, conc_mark_roots,                                 "Concurrent Mark Roots",           \
 67                                                                                   "  CMR: ")                         \
 68   SHENANDOAH_WORKER_PHASE_DEF(f, conc_mark,                                       "Concurrent Marking",              \
 69                                                                                   "  CM: ")                          \
 70   SHENANDOAH_SIMPLE_PHASE_DEF(f, conc_mark_rebalance_queues,                      "  Rebalance Queues")              \
 71   SHENANDOAH_SIMPLE_PHASE_DEF(f, conc_mark_satb_flush,                            "  Flush SATB")                    \
 72   SHENANDOAH_SIMPLE_PHASE_DEF(f, final_mark_gross,                                "Pause Final Mark (G)")            \
 73   SHENANDOAH_SIMPLE_PHASE_DEF(f, final_mark,                                      "Pause Final Mark (N)")            \
 74   SHENANDOAH_SIMPLE_PHASE_DEF(f, final_mark_verify,                               "  Verify")                        \
 75   SHENANDOAH_SIMPLE_PHASE_DEF(f, final_mark_flush_satb_roots,                     "  Flush SATB and Roots")          \
 76   SHENANDOAH_SIMPLE_PHASE_DEF(f, final_mark_rebalance_queues,                     "  Rebalance Queues")              \
 77   SHENANDOAH_WORKER_PHASE_DEF(f, finish_mark,                                     "  Finish Mark",                   \
 78                                                                                   "    FM: ")                        \
 79   SHENANDOAH_SIMPLE_PHASE_DEF(f, final_mark_propagate_gc_state,                   "  Propagate GC State")            \
 80   SHENANDOAH_WORKER_PHASE_DEF(f, purge,                                           "  System Purge",                  \
 81                                                                                   "      CU: ")                      \
 82   SHENANDOAH_WORKER_PHASE_DEF(f, purge_weak_par,                                  "    Weak Roots",                  \
 83                                                                                   "      WR: ")                      \
 84   SHENANDOAH_SIMPLE_PHASE_DEF(f, final_update_region_states,                      "  Update Region States")          \
 85   SHENANDOAH_SIMPLE_PHASE_DEF(f, final_manage_labs,                               "  Manage GC/TLABs")               \
 86   SHENANDOAH_SIMPLE_PHASE_DEF(f, choose_cset,                                     "  Choose Collection Set")         \
 87   SHENANDOAH_SIMPLE_PHASE_DEF(f, final_rebuild_freeset,                           "  Rebuild Free Set")              \
 88   SHENANDOAH_WORKER_PHASE_DEF(f, conc_thread_roots,                               "Concurrent Thread Roots",         \
 89                                                                                   "  CTR: ")                         \
 90   SHENANDOAH_WORKER_PHASE_DEF(f, conc_weak_refs,                                  "Concurrent Weak References",      \
 91                                                                                   "  CWRF: ")                        \
 92   SHENANDOAH_WORKER_PHASE_DEF(f, conc_weak_roots,                                 "Concurrent Weak Roots",           \
 93                                                                                   "  CWR: ")                         \
 94   SHENANDOAH_SIMPLE_PHASE_DEF(f, conc_weak_roots_rendezvous,                      "  Rendezvous")                    \
 95   SHENANDOAH_SIMPLE_PHASE_DEF(f, conc_cleanup_early,                              "Concurrent Cleanup, Early")       \
 96   SHENANDOAH_SIMPLE_PHASE_DEF(f, conc_class_unload,                               "Concurrent Class Unloading")      \
 97   SHENANDOAH_SIMPLE_PHASE_DEF(f, conc_class_unload_unlink,                        "  Unlink Stale")                  \
 98   SHENANDOAH_SIMPLE_PHASE_DEF(f, conc_class_unload_unlink_sd,                     "    System Dictionary")           \
 99   SHENANDOAH_SIMPLE_PHASE_DEF(f, conc_class_unload_unlink_weak_klass,             "    Weak Class Links")            \
100   SHENANDOAH_SIMPLE_PHASE_DEF(f, conc_class_unload_unlink_code_roots,             "    Code Roots")                  \
101   SHENANDOAH_SIMPLE_PHASE_DEF(f, conc_class_unload_rendezvous,                    "  Rendezvous")                    \
102   SHENANDOAH_SIMPLE_PHASE_DEF(f, conc_class_unload_purge,                         "  Purge Unlinked")                \
103   SHENANDOAH_SIMPLE_PHASE_DEF(f, conc_class_unload_purge_coderoots,               "    Code Roots")                  \
104   SHENANDOAH_SIMPLE_PHASE_DEF(f, conc_class_unload_purge_cldg,                    "    CLDG")                        \
105   SHENANDOAH_SIMPLE_PHASE_DEF(f, conc_class_unload_purge_ec,                      "    Exception Caches")            \
106   SHENANDOAH_WORKER_PHASE_DEF(f, conc_strong_roots,                               "Concurrent Strong Roots",         \
107                                                                                   "  CSR: ")                         \
108   SHENANDOAH_SIMPLE_PHASE_DEF(f, final_roots_gross,                               "Pause Final Roots (G)")           \
109   SHENANDOAH_SIMPLE_PHASE_DEF(f, final_roots,                                     "Pause Final Roots (N)")           \
110   SHENANDOAH_SIMPLE_PHASE_DEF(f, final_roots_propagate_gc_state,                  "  Propagate GC State")            \
111   SHENANDOAH_WORKER_PHASE_DEF(f, conc_evac,                                       "Concurrent Evacuation",           \
112                                                                                   "  CE: ")                          \
113   SHENANDOAH_SIMPLE_PHASE_DEF(f, conc_update_card_table,                          "Concurrent Update Cards")         \
114   SHENANDOAH_SIMPLE_PHASE_DEF(f, complete_abbreviated,                            "Complete Abbreviated Cycle")      \
115   SHENANDOAH_WORKER_PHASE_DEF(f, complete_abbreviated_promote_in_place,           "  Promote Regions",               \
116                                                                                   "    PIP: ")                       \
117   SHENANDOAH_SIMPLE_PHASE_DEF(f, complete_abbreviated_update_region_ages,         "  Update Region Ages")            \
118   SHENANDOAH_SIMPLE_PHASE_DEF(f, final_verify_gross,                              "Pause Final Verify (G)")          \
119   SHENANDOAH_SIMPLE_PHASE_DEF(f, final_verify,                                    "Pause Final Verify (N)")          \
120   SHENANDOAH_SIMPLE_PHASE_DEF(f, init_update_refs_gross,                          "Pause Init Update Refs (G)")      \
121   SHENANDOAH_SIMPLE_PHASE_DEF(f, init_update_refs,                                "Pause Init Update Refs (N)")      \
122   SHENANDOAH_SIMPLE_PHASE_DEF(f, init_update_refs_verify,                         "  Verify")                        \
123   SHENANDOAH_SIMPLE_PHASE_DEF(f, conc_update_refs_prepare,                        "Concurrent Update Refs Prepare")  \
124   SHENANDOAH_WORKER_PHASE_DEF(f, conc_update_refs,                                "Concurrent Update Refs",          \
125                                                                                   "  CUR: ")                         \
126   SHENANDOAH_SIMPLE_PHASE_DEF(f, conc_update_thread_roots,                        "Concurrent Update Thread Roots")  \
127   SHENANDOAH_SIMPLE_PHASE_DEF(f, final_update_refs_gross,                         "Pause Final Update Refs (G)")     \
128   SHENANDOAH_SIMPLE_PHASE_DEF(f, final_update_refs,                               "Pause Final Update Refs (N)")     \
129   SHENANDOAH_SIMPLE_PHASE_DEF(f, final_update_refs_verify,                        "  Verify")                        \
130   SHENANDOAH_SIMPLE_PHASE_DEF(f, final_update_refs_update_region_states,          "  Update Region States")          \
131   SHENANDOAH_SIMPLE_PHASE_DEF(f, final_update_refs_transfer_satb,                 "  Transfer Old From SATB")        \
132   SHENANDOAH_SIMPLE_PHASE_DEF(f, final_update_refs_trash_cset,                    "  Trash Collection Set")          \
133   SHENANDOAH_SIMPLE_PHASE_DEF(f, final_update_refs_rebuild_freeset,               "  Rebuild Free Set")              \
134   SHENANDOAH_SIMPLE_PHASE_DEF(f, final_update_refs_propagate_gc_state,            "  Propagate GC State")            \
135   SHENANDOAH_SIMPLE_PHASE_DEF(f, conc_cleanup_complete,                           "Concurrent Cleanup, Complete")    \
136   SHENANDOAH_WORKER_PHASE_DEF(f, conc_coalesce_and_fill,                          "Concurrent Coalesce and Fill",    \
137                                                                                   "  CC&F: ")                        \
138                                                                                                                      \
139   SHENANDOAH_SIMPLE_PHASE_DEF(f, degen_gc_gross,                                  "Pause Degenerated GC (G)")        \
140   SHENANDOAH_SIMPLE_PHASE_DEF(f, degen_gc,                                        "Pause Degenerated GC (N)")        \
141   SHENANDOAH_SIMPLE_PHASE_DEF(f, degen_gc_un_self_forward,                        "  Un-Self-Forward")               \
142   SHENANDOAH_WORKER_PHASE_DEF(f, degen_gc_mark,                                   "  Mark",                          \
143                                                                                   "    DM: ")                        \
144   SHENANDOAH_SIMPLE_PHASE_DEF(f, degen_gc_purge,                                  "  System Purge")                  \
145   SHENANDOAH_WORKER_PHASE_DEF(f, degen_gc_weakrefs,                               "    Weak References",             \
146                                                                                   "      WRP: ")                     \
147   SHENANDOAH_WORKER_PHASE_DEF(f, degen_gc_purge_class_unload,                     "    Unload Classes",              \
148                                                                                   "      DCU: ")                     \
149   SHENANDOAH_WORKER_PHASE_DEF(f, degen_gc_purge_weak_par,                         "    Weak Roots",                  \
150                                                                                   "      DWR: ")                     \
151   SHENANDOAH_SIMPLE_PHASE_DEF(f, degen_gc_purge_cldg,                             "    CLDG")                        \
152   SHENANDOAH_SIMPLE_PHASE_DEF(f, degen_gc_final_update_region_states,             "  Update Region States")          \
153   SHENANDOAH_SIMPLE_PHASE_DEF(f, degen_gc_final_manage_labs,                      "  Manage GC/TLABs")               \
154   SHENANDOAH_SIMPLE_PHASE_DEF(f, degen_gc_choose_cset,                            "  Choose Collection Set")         \
155   SHENANDOAH_SIMPLE_PHASE_DEF(f, degen_gc_final_rebuild_freeset,                  "  Rebuild Free Set")              \
156   SHENANDOAH_WORKER_PHASE_DEF(f, degen_gc_evac,                                   "  Evacuation",                    \
157                                                                                   "    DE: ")                        \
158   SHENANDOAH_SIMPLE_PHASE_DEF(f, degen_gc_init_update_refs_manage_gclabs,         "  Manage GCLABs")                 \
159   SHENANDOAH_WORKER_PHASE_DEF(f, degen_gc_update_refs,                            "  Update References",             \
160                                                                                   "    DUR: ")                       \
161   SHENANDOAH_SIMPLE_PHASE_DEF(f, degen_gc_final_update_refs_update_region_states, "  Update Region States")          \
162   SHENANDOAH_SIMPLE_PHASE_DEF(f, degen_gc_final_update_refs_trash_cset,           "  Trash Collection Set")          \
163   SHENANDOAH_SIMPLE_PHASE_DEF(f, degen_gc_final_update_refs_rebuild_freeset,      "  Rebuild Free Set")              \
164   SHENANDOAH_WORKER_PHASE_DEF(f, degen_gc_update_roots,                           "  Degen Update Roots",            \
165                                                                                   "    DU: ")                        \
166   SHENANDOAH_SIMPLE_PHASE_DEF(f, degen_gc_cleanup_complete,                       "  Cleanup")                       \
167   SHENANDOAH_SIMPLE_PHASE_DEF(f, degen_gc_promote_regions,                        "  Degen Promote Regions")         \
168   SHENANDOAH_WORKER_PHASE_DEF(f, degen_gc_coalesce_and_fill,                      "  Degen Coalesce and Fill",       \
169                                                                                   "    DC&F")                        \
170   SHENANDOAH_SIMPLE_PHASE_DEF(f, degen_gc_propagate_gc_state,                     "  Propagate GC State")            \
171                                                                                                                      \
172   SHENANDOAH_SIMPLE_PHASE_DEF(f, full_gc_gross,                                   "Pause Full GC (G)")               \
173   SHENANDOAH_SIMPLE_PHASE_DEF(f, full_gc,                                         "Pause Full GC (N)")               \
174   SHENANDOAH_SIMPLE_PHASE_DEF(f, full_gc_un_self_forward,                         "  Un-Self-Forward")               \
175   SHENANDOAH_SIMPLE_PHASE_DEF(f, full_gc_heapdump_pre,                            "  Pre Heap Dump")                 \
176   SHENANDOAH_SIMPLE_PHASE_DEF(f, full_gc_prepare,                                 "  Prepare")                       \
177   SHENANDOAH_WORKER_PHASE_DEF(f, full_gc_update_roots,                            "    Update Roots",                \
178                                                                                   "      FU: ")                      \
179   SHENANDOAH_WORKER_PHASE_DEF(f, full_gc_mark,                                    "  Mark",                          \
180                                                                                   "    FM: ")                        \
181   SHENANDOAH_SIMPLE_PHASE_DEF(f, full_gc_purge,                                   "  System Purge")                  \
182   SHENANDOAH_WORKER_PHASE_DEF(f, full_gc_weakrefs,                                "    Weak References",             \
183                                                                                   "      WRP: ")                     \
184   SHENANDOAH_WORKER_PHASE_DEF(f, full_gc_purge_class_unload,                      "    Unload Classes",              \
185                                                                                   "      CU: ")                      \
186   SHENANDOAH_WORKER_PHASE_DEF(f, full_gc_purge_weak_par,                          "    Weak Roots",                  \
187                                                                                   "      WR: ")                      \
188   SHENANDOAH_SIMPLE_PHASE_DEF(f, full_gc_purge_cldg,                              "    CLDG")                        \
189   SHENANDOAH_SIMPLE_PHASE_DEF(f, full_gc_calculate_addresses,                     "  Calculate Addresses")           \
190   SHENANDOAH_SIMPLE_PHASE_DEF(f, full_gc_calculate_addresses_regular,             "    Regular Objects")             \
191   SHENANDOAH_SIMPLE_PHASE_DEF(f, full_gc_calculate_addresses_humong,              "    Humongous Objects")           \
192   SHENANDOAH_SIMPLE_PHASE_DEF(f, full_gc_adjust_pointers,                         "  Adjust Pointers")               \
193   SHENANDOAH_WORKER_PHASE_DEF(f, full_gc_adjust_roots,                            "  Adjust Roots",                  \
194                                                                                   "    FA: ")                        \
195   SHENANDOAH_SIMPLE_PHASE_DEF(f, full_gc_copy_objects,                            "  Copy Objects")                  \
196   SHENANDOAH_SIMPLE_PHASE_DEF(f, full_gc_copy_objects_regular,                    "    Regular Objects")             \
197   SHENANDOAH_SIMPLE_PHASE_DEF(f, full_gc_copy_objects_humong,                     "    Humongous Objects")           \
198   SHENANDOAH_SIMPLE_PHASE_DEF(f, full_gc_recompute_generation_usage,              "    Recompute generation usage")  \
199   SHENANDOAH_SIMPLE_PHASE_DEF(f, full_gc_copy_objects_reset_complete,             "    Reset Complete Bitmap")       \
200   SHENANDOAH_SIMPLE_PHASE_DEF(f, full_gc_copy_objects_rebuild,                    "    Rebuild Region Sets")         \
201   SHENANDOAH_SIMPLE_PHASE_DEF(f, full_gc_reconstruct_remembered_set,              "    Reconstruct Remembered Set")  \
202   SHENANDOAH_SIMPLE_PHASE_DEF(f, full_gc_heapdump_post,                           "  Post Heap Dump")                \
203   SHENANDOAH_SIMPLE_PHASE_DEF(f, full_gc_propagate_gc_state,                      "  Propagate GC State")            \
204                                                                                                                      \
205   SHENANDOAH_SIMPLE_PHASE_DEF(f, conc_reset_after_collect,                        "Concurrent Reset After Collect")  \
206                                                                                                                      \
207   SHENANDOAH_WORKER_PHASE_DEF(f, heap_iteration_roots,                            "Heap Iteration",                  \
208                                                                                   "  HI: ")                          \
209   // END
210 
211 typedef WorkerDataArray<double> ShenandoahWorkerData;
212 
213 class ShenandoahPhaseTimings : public CHeapObj<mtGC> {
214   friend class ShenandoahGCPhase;
215   friend class ShenandoahWorkerTimingsTracker;
216 public:
217 #define SHENANDOAH_PHASE_DECLARE_ENUM(name, desc, has_worker_phase) name,
218 
219   enum Phase {
220     SHENANDOAH_PHASE_DO(SHENANDOAH_PHASE_DECLARE_ENUM)
221     _num_phases,
222     _invalid_phase = _num_phases
223   };
224 
225   enum WorkerPhase {
226     SHENANDOAH_WORKER_PHASE_DO(,, SHENANDOAH_PHASE_DECLARE_ENUM)
227     _num_par_phases
228   };
229 
230 #undef SHENANDOAH_PHASE_DECLARE_ENUM
231 
232 private:
233   uint                _max_workers;
234   double              _cycle_data[_num_phases];
235   HdrSeq              _global_data[_num_phases];
236   static const char*  _desc[_num_phases];
237   static bool         _has_worker_phase[_num_phases];
238 
239   ShenandoahWorkerData* _worker_data[_num_phases];
240   ShenandoahCollectorPolicy* _policy;
241 
242   static bool is_root_work_phase(Phase phase);
243 
244   ShenandoahWorkerData* worker_data(Phase phase, WorkerPhase par_phase);
245   static Phase compute_phase_slot(Phase phase, WorkerPhase worker_phase);
246 
247   void set_cycle_data(Phase phase, double time, bool should_aggregate = false);
248   static double uninitialized() { return -1; }
249 
250 public:
251   ShenandoahPhaseTimings(uint max_workers);
252 
253   void record_phase_time(Phase phase, double time, bool should_aggregate = false);
254 
255   void record_workers_start(Phase phase);
256   void record_workers_end(Phase phase);
257 
258   void flush_par_workers_to_cycle();
259   void flush_cycle_to_global();
260 
261   static const char* phase_desc(Phase phase) {
262     assert(phase >= 0 && phase < _num_phases, "Out of bounds: %d", phase);
263     return _desc[phase];
264   }
265 
266   static bool has_worker_phases(Phase phase) {
267     assert(phase >= 0 && phase < _num_phases, "Out of bounds: %d", phase);
268     return _has_worker_phase[phase];
269   }
270 
271   void print_cycle_on(outputStream* out) const;
272   void print_global_on(outputStream* out) const;
273 };
274 
275 class ShenandoahWorkerTimingsTracker : public StackObj {
276 private:
277   ShenandoahPhaseTimings*          const _timings;
278   ShenandoahPhaseTimings::Phase    const _phase;
279   ShenandoahPhaseTimings::WorkerPhase const _worker_phase;
280   uint const _worker_id;
281 
282   double _start_time;
283   EventGCPhaseParallel _event;
284 public:
285   ShenandoahWorkerTimingsTracker(ShenandoahPhaseTimings::Phase phase,
286                                  ShenandoahPhaseTimings::WorkerPhase worker_phase,
287                                  uint worker_id,
288                                  bool cumulative = false);
289   ~ShenandoahWorkerTimingsTracker();
290 };
291 
292 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHPHASETIMINGS_HPP