< prev index next >

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

Print this page
rev 58201 : 8240216: Shenandoah: remove ShenandoahTerminationTrace
Reviewed-by: XXX


  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  */
  24 
  25 #ifndef SHARE_GC_SHENANDOAH_SHENANDOAHPHASETIMINGS_HPP
  26 #define SHARE_GC_SHENANDOAH_SHENANDOAHPHASETIMINGS_HPP
  27 
  28 #include "gc/shenandoah/shenandoahNumberSeq.hpp"
  29 #include "gc/shared/workerDataArray.hpp"
  30 #include "memory/allocation.hpp"
  31 
  32 class ShenandoahCollectorPolicy;
  33 class ShenandoahWorkerTimings;
  34 class ShenandoahTerminationTimings;
  35 class outputStream;
  36 
  37 #define SHENANDOAH_GC_PHASE_DO(f)                                                       \
  38   f(total_pause_gross,                              "Total Pauses (G)")                 \
  39   f(total_pause,                                    "Total Pauses (N)")                 \
  40   f(init_mark_gross,                                "Pause Init Mark (G)")              \
  41   f(init_mark,                                      "Pause Init Mark (N)")              \
  42   f(make_parsable,                                  "  Make Parsable")                  \
  43   f(clear_liveness,                                 "  Clear Liveness")                 \
  44                                                                                         \
  45   /* Per-thread timer block, should have "roots" counters in consistent order */        \
  46   f(scan_roots,                                     "  Scan Roots")                     \
  47   f(scan_thread_roots,                              "    S: Thread Roots")              \
  48   f(scan_code_roots,                                "    S: Code Cache Roots")          \
  49   f(scan_universe_roots,                            "    S: Universe Roots")            \
  50   f(scan_jni_roots,                                 "    S: JNI Roots")                 \
  51   f(scan_jvmti_weak_roots,                          "    S: JVMTI Weak Roots")          \
  52   f(scan_jfr_weak_roots,                            "    S: JFR Weak Roots")            \
  53   f(scan_jni_weak_roots,                            "    S: JNI Weak Roots")            \
  54   f(scan_stringtable_roots,                         "    S: String Table Roots")        \


  75   f(update_code_roots,                              "    U: Code Cache Roots")          \
  76   f(update_universe_roots,                          "    U: Universe Roots")            \
  77   f(update_jni_roots,                               "    U: JNI Roots")                 \
  78   f(update_jvmti_weak_roots,                        "    U: JVMTI Weak Roots")          \
  79   f(update_jfr_weak_roots,                          "    U: JFR Weak Roots")            \
  80   f(update_jni_weak_roots,                          "    U: JNI Weak Roots")            \
  81   f(update_stringtable_roots,                       "    U: String Table Roots")        \
  82   f(update_resolved_method_table_roots,             "    U: Resolved Table Roots")      \
  83   f(update_vm_global_roots,                         "    U: VM Global Roots")           \
  84   f(update_vm_weak_roots,                           "    U: VM Weak Roots")             \
  85   f(update_synchronizer_roots,                      "    U: Synchronizer Roots")        \
  86   f(update_management_roots,                        "    U: Management Roots")          \
  87   f(update_system_dictionary_roots,                 "    U: System Dict Roots")         \
  88   f(update_cldg_roots,                              "    U: CLDG Roots")                \
  89   f(update_jvmti_roots,                             "    U: JVMTI Roots")               \
  90   f(update_string_dedup_table_roots,                "    U: Dedup Table Roots")         \
  91   f(update_string_dedup_queue_roots,                "    U: Dedup Queue Roots")         \
  92   f(update_finish_queues,                           "    U: Finish Queues")             \
  93                                                                                         \
  94   f(finish_queues,                                  "  Finish Queues")                  \
  95   f(termination,                                    "    Termination")                  \
  96   f(weakrefs,                                       "  Weak References")                \
  97   f(weakrefs_process,                               "    Process")                      \
  98   f(weakrefs_termination,                           "      Termination")                \
  99   f(purge,                                          "  System Purge")                   \
 100   f(purge_class_unload,                             "    Unload Classes")               \
 101   f(purge_par,                                      "    Parallel Cleanup")             \
 102   f(purge_cldg,                                     "    CLDG")                         \
 103   f(complete_liveness,                              "  Complete Liveness")              \
 104   f(retire_tlabs,                                   "  Retire TLABs")                   \
 105   f(sync_pinned,                                    "  Sync Pinned")                    \
 106   f(trash_cset,                                     "  Trash CSet")                     \
 107   f(prepare_evac,                                   "  Prepare Evacuation")             \
 108                                                                                         \
 109   /* Per-thread timer block, should have "roots" counters in consistent order */        \
 110   f(init_evac,                                      "  Initial Evacuation")             \
 111   f(evac_thread_roots,                              "    E: Thread Roots")              \
 112   f(evac_code_roots,                                "    E: Code Cache Roots")          \
 113   f(evac_universe_roots,                            "    E: Universe Roots")            \
 114   f(evac_jni_roots,                                 "    E: JNI Roots")                 \
 115   f(evac_jvmti_weak_roots,                          "    E: JVMTI Weak Roots")          \
 116   f(evac_jfr_weak_roots,                            "    E: JFR Weak Roots")            \
 117   f(evac_jni_weak_roots,                            "    E: JNI Weak Roots")            \
 118   f(evac_stringtable_roots,                         "    E: String Table Roots")        \


 227   f(final_traversal_gc_work,                         "  Work")                          \
 228   f(final_traversal_gc_thread_roots,                 "    TF: Thread Roots")            \
 229   f(final_traversal_gc_code_roots,                   "    TF: Code Cache Roots")        \
 230   f(final_traversal_gc_universe_roots,               "    TF: Universe Roots")          \
 231   f(final_traversal_gc_jni_roots,                    "    TF: JNI Roots")               \
 232   f(final_traversal_gc_jvmti_weak_roots,             "    TF: JVMTI Weak Roots")        \
 233   f(final_traversal_gc_jfr_weak_roots,               "    TF: JFR Weak Roots")          \
 234   f(final_traversal_gc_jni_weak_roots,               "    TF: JNI Weak Roots")          \
 235   f(final_traversal_gc_stringtable_roots,            "    TF: String Table Roots")      \
 236   f(final_traversal_gc_resolved_method_table_roots,  "    TF: Resolved Table Roots")    \
 237   f(final_traversal_gc_vm_global_roots,              "    TF: VM Global Roots")         \
 238   f(final_traversal_gc_vm_weak_roots,                "    TF: VM Weak Roots")           \
 239   f(final_traversal_gc_synchronizer_roots,           "    TF: Synchronizer Roots")      \
 240   f(final_traversal_gc_management_roots,             "    TF: Management Roots")        \
 241   f(final_traversal_gc_system_dict_roots,            "    TF: System Dict Roots")       \
 242   f(final_traversal_gc_cldg_roots,                   "    TF: CLDG Roots")              \
 243   f(final_traversal_gc_jvmti_roots,                  "    TF: JVMTI Roots")             \
 244   f(final_traversal_gc_string_dedup_table_roots,     "    TF: Dedup Table Roots")       \
 245   f(final_traversal_gc_string_dedup_queue_roots,     "    TF: Dedup Queue Roots")       \
 246   f(final_traversal_gc_finish_queues,                "    TF: Finish Queues")           \
 247   f(final_traversal_gc_termination,                  "    TF:   Termination")           \
 248                                                                                         \
 249   /* Per-thread timer block, should have "roots" counters in consistent order */        \
 250   f(final_traversal_update_roots,                       "  Update Roots")               \
 251   f(final_traversal_update_thread_roots,                "    TU: Thread Roots")         \
 252   f(final_traversal_update_code_roots,                  "    TU: Code Cache Roots")     \
 253   f(final_traversal_update_universe_roots,              "    TU: Universe Roots")       \
 254   f(final_traversal_update_jni_roots,                   "    TU: JNI Roots")            \
 255   f(final_traversal_update_jvmti_weak_roots,            "    TU: JVMTI Weak Roots")     \
 256   f(final_traversal_update_jfr_weak_roots,              "    TU: JFR Weak Roots")       \
 257   f(final_traversal_update_jni_weak_roots,              "    TU: JNI Weak Roots")       \
 258   f(final_traversal_update_stringtable_roots,           "    TU: String Table Roots")   \
 259   f(final_traversal_update_resolved_method_table_roots, "    TU: Resolved Table Roots") \
 260   f(final_traversal_update_vm_global_roots,             "    TU: VM Global Roots")      \
 261   f(final_traversal_update_vm_weak_roots,               "    TU: VM Weak Roots")        \
 262   f(final_traversal_update_synchronizer_roots,          "    TU: Synchronizer Roots")   \
 263   f(final_traversal_update_management_roots,            "    TU: Management Roots")     \
 264   f(final_traversal_update_system_dict_roots,           "    TU: System Dict Roots")    \
 265   f(final_traversal_update_cldg_roots,                  "    TU: CLDG Roots")           \
 266   f(final_traversal_update_jvmti_roots,                 "    TU: JVMTI Roots")          \
 267   f(final_traversal_update_string_dedup_table_roots,    "    TU: Dedup Table Roots")    \


 283   f(full_gc_universe_roots,                          "    F: Universe Roots")           \
 284   f(full_gc_jni_roots,                               "    F: JNI Roots")                \
 285   f(full_gc_jvmti_weak_roots,                        "    F: JVMTI Weak Roots")         \
 286   f(full_gc_jfr_weak_roots,                          "    F: JFR Weak Roots")           \
 287   f(full_gc_jni_weak_roots,                          "    F: JNI Weak Roots")           \
 288   f(full_gc_stringtable_roots,                       "    F: String Table Roots")       \
 289   f(full_gc_resolved_method_table_roots,             "    F: Resolved Table Roots")     \
 290   f(full_gc_vm_global_roots,                         "    F: VM Global Roots")          \
 291   f(full_gc_vm_weak_roots,                           "    F: VM Weak Roots")            \
 292   f(full_gc_synchronizer_roots,                      "    F: Synchronizer Roots")       \
 293   f(full_gc_management_roots,                        "    F: Management Roots")         \
 294   f(full_gc_system_dictionary_roots,                 "    F: System Dict Roots")        \
 295   f(full_gc_cldg_roots,                              "    F: CLDG Roots")               \
 296   f(full_gc_jvmti_roots,                             "    F: JVMTI Roots")              \
 297   f(full_gc_string_dedup_table_roots,                "    F: Dedup Table Roots")        \
 298   f(full_gc_string_dedup_queue_roots,                "    F: Dedup Queue Roots")        \
 299   f(full_gc_finish_queues,                           "    F: Finish Queues")            \
 300                                                                                         \
 301   f(full_gc_mark,                                    "  Mark")                          \
 302   f(full_gc_mark_finish_queues,                      "    Finish Queues")               \
 303   f(full_gc_mark_termination,                        "      Termination")               \
 304   f(full_gc_weakrefs,                                "    Weak References")             \
 305   f(full_gc_weakrefs_process,                        "      Process")                   \
 306   f(full_gc_weakrefs_termination,                    "        Termination")             \
 307   f(full_gc_purge,                                   "    System Purge")                \
 308   f(full_gc_purge_class_unload,                      "      Unload Classes")            \
 309   f(full_gc_purge_par,                               "    Parallel Cleanup")            \
 310   f(full_gc_purge_cldg,                              "    CLDG")                        \
 311   f(full_gc_calculate_addresses,                     "  Calculate Addresses")           \
 312   f(full_gc_calculate_addresses_regular,             "    Regular Objects")             \
 313   f(full_gc_calculate_addresses_humong,              "    Humongous Objects")           \
 314   f(full_gc_adjust_pointers,                         "  Adjust Pointers")               \
 315   f(full_gc_copy_objects,                            "  Copy Objects")                  \
 316   f(full_gc_copy_objects_regular,                    "    Regular Objects")             \
 317   f(full_gc_copy_objects_humong,                     "    Humongous Objects")           \
 318   f(full_gc_copy_objects_reset_complete,             "    Reset Complete Bitmap")       \
 319   f(full_gc_copy_objects_rebuild,                    "    Rebuild Region Sets")         \
 320   f(full_gc_resize_tlabs,                            "  Resize TLABs")                  \
 321                                                                                         \
 322   /* Longer concurrent phases at the end */                                             \
 323   f(conc_reset,                                      "Concurrent Reset")                \
 324   f(conc_mark,                                       "Concurrent Marking")              \
 325   f(conc_termination,                                "  Termination")                   \
 326   f(conc_preclean,                                   "Concurrent Precleaning")          \
 327   f(conc_roots,                                      "Concurrent Roots")                \
 328   f(conc_evac,                                       "Concurrent Evacuation")           \
 329   f(conc_update_refs,                                "Concurrent Update Refs")          \
 330   f(conc_cleanup,                                    "Concurrent Cleanup")              \
 331   f(conc_traversal,                                  "Concurrent Traversal")            \
 332   f(conc_traversal_termination,                      "  Termination")                   \
 333                                                                                         \
 334   f(conc_uncommit,                                   "Concurrent Uncommit")             \
 335                                                                                         \
 336   /* Unclassified */                                                                    \
 337   f(pause_other,                                     "Pause Other")                     \
 338   f(conc_other,                                      "Concurrent Other")                \
 339   // end
 340 
 341 #define SHENANDOAH_GC_PAR_PHASE_DO(f)                           \
 342   f(ThreadRoots,              "Thread Roots (ms):")              \
 343   f(CodeCacheRoots,           "CodeCache Roots (ms):")           \
 344   f(UniverseRoots,            "Universe Roots (ms):")            \
 345   f(JNIRoots,                 "JNI Handles Roots (ms):")         \
 346   f(JVMTIWeakRoots,           "JVMTI Weak Roots (ms):")          \
 347   f(JFRWeakRoots,             "JFR Weak Roots (ms):")            \
 348   f(JNIWeakRoots,             "JNI Weak Roots (ms):")            \
 349   f(StringTableRoots,         "StringTable Roots(ms):")          \
 350   f(ResolvedMethodTableRoots, "Resolved Table Roots(ms):")       \
 351   f(VMGlobalRoots,            "VM Global Roots(ms)")             \
 352   f(VMWeakRoots,              "VM Weak Roots(ms)")               \


 373   // init_evac, final_update_refs_roots and full_gc_roots).
 374   // Make sure they are following this order.
 375   enum GCParPhases {
 376     SHENANDOAH_GC_PAR_PHASE_DO(GC_PHASE_DECLARE_ENUM)
 377     GCParPhasesSentinel
 378   };
 379 
 380 #undef GC_PHASE_DECLARE_ENUM
 381 
 382 private:
 383   struct TimingData {
 384     HdrSeq _secs;
 385     double _start;
 386   };
 387 
 388 private:
 389   TimingData          _timing_data[_num_phases];
 390   static const char*  _phase_names[_num_phases];
 391 
 392   ShenandoahWorkerTimings*      _worker_times;
 393   ShenandoahTerminationTimings* _termination_times;
 394 
 395   ShenandoahCollectorPolicy* _policy;
 396 
 397 public:
 398   ShenandoahPhaseTimings();
 399 
 400   ShenandoahWorkerTimings* const worker_times() const { return _worker_times; }
 401   ShenandoahTerminationTimings* const termination_times() const { return _termination_times; }
 402 
 403   // record phase start
 404   void record_phase_start(Phase phase);
 405   // record phase end and return elapsed time in seconds for the phase
 406   void record_phase_end(Phase phase);
 407   // record an elapsed time for the phase
 408   void record_phase_time(Phase phase, double time);
 409 
 410   void record_workers_start(Phase phase);
 411   void record_workers_end(Phase phase);
 412 
 413   static const char* phase_name(Phase phase) {
 414     assert(phase >= 0 && phase < _num_phases, "Out of bound");
 415     return _phase_names[phase];
 416   }
 417 
 418   void print_on(outputStream* out) const;
 419 
 420 private:
 421   void init_phase_names();
 422   void print_summary_sd(outputStream* out, const char* str, const HdrSeq* seq) const;
 423 };
 424 
 425 class ShenandoahWorkerTimings : public CHeapObj<mtGC> {
 426 private:
 427   uint _max_gc_threads;
 428   WorkerDataArray<double>* _gc_par_phases[ShenandoahPhaseTimings::GCParPhasesSentinel];
 429 
 430 public:
 431   ShenandoahWorkerTimings(uint max_gc_threads);
 432 
 433   // record the time a phase took in seconds
 434   void record_time_secs(ShenandoahPhaseTimings::GCParPhases phase, uint worker_i, double secs);
 435 
 436   double average(uint i) const;
 437   void reset(uint i);
 438   void print() const;
 439 };
 440 
 441 class ShenandoahTerminationTimings : public CHeapObj<mtGC> {
 442 private:
 443   WorkerDataArray<double>* _gc_termination_phase;
 444 public:
 445   ShenandoahTerminationTimings(uint max_gc_threads);
 446 
 447   // record the time a phase took in seconds
 448   void record_time_secs(uint worker_i, double secs);
 449 
 450   double average() const;
 451   void reset();
 452 
 453   void print() const;
 454 };
 455 
 456 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHPHASETIMINGS_HPP


  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  */
  24 
  25 #ifndef SHARE_GC_SHENANDOAH_SHENANDOAHPHASETIMINGS_HPP
  26 #define SHARE_GC_SHENANDOAH_SHENANDOAHPHASETIMINGS_HPP
  27 
  28 #include "gc/shenandoah/shenandoahNumberSeq.hpp"
  29 #include "gc/shared/workerDataArray.hpp"
  30 #include "memory/allocation.hpp"
  31 
  32 class ShenandoahCollectorPolicy;
  33 class ShenandoahWorkerTimings;

  34 class outputStream;
  35 
  36 #define SHENANDOAH_GC_PHASE_DO(f)                                                       \
  37   f(total_pause_gross,                              "Total Pauses (G)")                 \
  38   f(total_pause,                                    "Total Pauses (N)")                 \
  39   f(init_mark_gross,                                "Pause Init Mark (G)")              \
  40   f(init_mark,                                      "Pause Init Mark (N)")              \
  41   f(make_parsable,                                  "  Make Parsable")                  \
  42   f(clear_liveness,                                 "  Clear Liveness")                 \
  43                                                                                         \
  44   /* Per-thread timer block, should have "roots" counters in consistent order */        \
  45   f(scan_roots,                                     "  Scan Roots")                     \
  46   f(scan_thread_roots,                              "    S: Thread Roots")              \
  47   f(scan_code_roots,                                "    S: Code Cache Roots")          \
  48   f(scan_universe_roots,                            "    S: Universe Roots")            \
  49   f(scan_jni_roots,                                 "    S: JNI Roots")                 \
  50   f(scan_jvmti_weak_roots,                          "    S: JVMTI Weak Roots")          \
  51   f(scan_jfr_weak_roots,                            "    S: JFR Weak Roots")            \
  52   f(scan_jni_weak_roots,                            "    S: JNI Weak Roots")            \
  53   f(scan_stringtable_roots,                         "    S: String Table Roots")        \


  74   f(update_code_roots,                              "    U: Code Cache Roots")          \
  75   f(update_universe_roots,                          "    U: Universe Roots")            \
  76   f(update_jni_roots,                               "    U: JNI Roots")                 \
  77   f(update_jvmti_weak_roots,                        "    U: JVMTI Weak Roots")          \
  78   f(update_jfr_weak_roots,                          "    U: JFR Weak Roots")            \
  79   f(update_jni_weak_roots,                          "    U: JNI Weak Roots")            \
  80   f(update_stringtable_roots,                       "    U: String Table Roots")        \
  81   f(update_resolved_method_table_roots,             "    U: Resolved Table Roots")      \
  82   f(update_vm_global_roots,                         "    U: VM Global Roots")           \
  83   f(update_vm_weak_roots,                           "    U: VM Weak Roots")             \
  84   f(update_synchronizer_roots,                      "    U: Synchronizer Roots")        \
  85   f(update_management_roots,                        "    U: Management Roots")          \
  86   f(update_system_dictionary_roots,                 "    U: System Dict Roots")         \
  87   f(update_cldg_roots,                              "    U: CLDG Roots")                \
  88   f(update_jvmti_roots,                             "    U: JVMTI Roots")               \
  89   f(update_string_dedup_table_roots,                "    U: Dedup Table Roots")         \
  90   f(update_string_dedup_queue_roots,                "    U: Dedup Queue Roots")         \
  91   f(update_finish_queues,                           "    U: Finish Queues")             \
  92                                                                                         \
  93   f(finish_queues,                                  "  Finish Queues")                  \

  94   f(weakrefs,                                       "  Weak References")                \
  95   f(weakrefs_process,                               "    Process")                      \

  96   f(purge,                                          "  System Purge")                   \
  97   f(purge_class_unload,                             "    Unload Classes")               \
  98   f(purge_par,                                      "    Parallel Cleanup")             \
  99   f(purge_cldg,                                     "    CLDG")                         \
 100   f(complete_liveness,                              "  Complete Liveness")              \
 101   f(retire_tlabs,                                   "  Retire TLABs")                   \
 102   f(sync_pinned,                                    "  Sync Pinned")                    \
 103   f(trash_cset,                                     "  Trash CSet")                     \
 104   f(prepare_evac,                                   "  Prepare Evacuation")             \
 105                                                                                         \
 106   /* Per-thread timer block, should have "roots" counters in consistent order */        \
 107   f(init_evac,                                      "  Initial Evacuation")             \
 108   f(evac_thread_roots,                              "    E: Thread Roots")              \
 109   f(evac_code_roots,                                "    E: Code Cache Roots")          \
 110   f(evac_universe_roots,                            "    E: Universe Roots")            \
 111   f(evac_jni_roots,                                 "    E: JNI Roots")                 \
 112   f(evac_jvmti_weak_roots,                          "    E: JVMTI Weak Roots")          \
 113   f(evac_jfr_weak_roots,                            "    E: JFR Weak Roots")            \
 114   f(evac_jni_weak_roots,                            "    E: JNI Weak Roots")            \
 115   f(evac_stringtable_roots,                         "    E: String Table Roots")        \


 224   f(final_traversal_gc_work,                         "  Work")                          \
 225   f(final_traversal_gc_thread_roots,                 "    TF: Thread Roots")            \
 226   f(final_traversal_gc_code_roots,                   "    TF: Code Cache Roots")        \
 227   f(final_traversal_gc_universe_roots,               "    TF: Universe Roots")          \
 228   f(final_traversal_gc_jni_roots,                    "    TF: JNI Roots")               \
 229   f(final_traversal_gc_jvmti_weak_roots,             "    TF: JVMTI Weak Roots")        \
 230   f(final_traversal_gc_jfr_weak_roots,               "    TF: JFR Weak Roots")          \
 231   f(final_traversal_gc_jni_weak_roots,               "    TF: JNI Weak Roots")          \
 232   f(final_traversal_gc_stringtable_roots,            "    TF: String Table Roots")      \
 233   f(final_traversal_gc_resolved_method_table_roots,  "    TF: Resolved Table Roots")    \
 234   f(final_traversal_gc_vm_global_roots,              "    TF: VM Global Roots")         \
 235   f(final_traversal_gc_vm_weak_roots,                "    TF: VM Weak Roots")           \
 236   f(final_traversal_gc_synchronizer_roots,           "    TF: Synchronizer Roots")      \
 237   f(final_traversal_gc_management_roots,             "    TF: Management Roots")        \
 238   f(final_traversal_gc_system_dict_roots,            "    TF: System Dict Roots")       \
 239   f(final_traversal_gc_cldg_roots,                   "    TF: CLDG Roots")              \
 240   f(final_traversal_gc_jvmti_roots,                  "    TF: JVMTI Roots")             \
 241   f(final_traversal_gc_string_dedup_table_roots,     "    TF: Dedup Table Roots")       \
 242   f(final_traversal_gc_string_dedup_queue_roots,     "    TF: Dedup Queue Roots")       \
 243   f(final_traversal_gc_finish_queues,                "    TF: Finish Queues")           \

 244                                                                                         \
 245   /* Per-thread timer block, should have "roots" counters in consistent order */        \
 246   f(final_traversal_update_roots,                       "  Update Roots")               \
 247   f(final_traversal_update_thread_roots,                "    TU: Thread Roots")         \
 248   f(final_traversal_update_code_roots,                  "    TU: Code Cache Roots")     \
 249   f(final_traversal_update_universe_roots,              "    TU: Universe Roots")       \
 250   f(final_traversal_update_jni_roots,                   "    TU: JNI Roots")            \
 251   f(final_traversal_update_jvmti_weak_roots,            "    TU: JVMTI Weak Roots")     \
 252   f(final_traversal_update_jfr_weak_roots,              "    TU: JFR Weak Roots")       \
 253   f(final_traversal_update_jni_weak_roots,              "    TU: JNI Weak Roots")       \
 254   f(final_traversal_update_stringtable_roots,           "    TU: String Table Roots")   \
 255   f(final_traversal_update_resolved_method_table_roots, "    TU: Resolved Table Roots") \
 256   f(final_traversal_update_vm_global_roots,             "    TU: VM Global Roots")      \
 257   f(final_traversal_update_vm_weak_roots,               "    TU: VM Weak Roots")        \
 258   f(final_traversal_update_synchronizer_roots,          "    TU: Synchronizer Roots")   \
 259   f(final_traversal_update_management_roots,            "    TU: Management Roots")     \
 260   f(final_traversal_update_system_dict_roots,           "    TU: System Dict Roots")    \
 261   f(final_traversal_update_cldg_roots,                  "    TU: CLDG Roots")           \
 262   f(final_traversal_update_jvmti_roots,                 "    TU: JVMTI Roots")          \
 263   f(final_traversal_update_string_dedup_table_roots,    "    TU: Dedup Table Roots")    \


 279   f(full_gc_universe_roots,                          "    F: Universe Roots")           \
 280   f(full_gc_jni_roots,                               "    F: JNI Roots")                \
 281   f(full_gc_jvmti_weak_roots,                        "    F: JVMTI Weak Roots")         \
 282   f(full_gc_jfr_weak_roots,                          "    F: JFR Weak Roots")           \
 283   f(full_gc_jni_weak_roots,                          "    F: JNI Weak Roots")           \
 284   f(full_gc_stringtable_roots,                       "    F: String Table Roots")       \
 285   f(full_gc_resolved_method_table_roots,             "    F: Resolved Table Roots")     \
 286   f(full_gc_vm_global_roots,                         "    F: VM Global Roots")          \
 287   f(full_gc_vm_weak_roots,                           "    F: VM Weak Roots")            \
 288   f(full_gc_synchronizer_roots,                      "    F: Synchronizer Roots")       \
 289   f(full_gc_management_roots,                        "    F: Management Roots")         \
 290   f(full_gc_system_dictionary_roots,                 "    F: System Dict Roots")        \
 291   f(full_gc_cldg_roots,                              "    F: CLDG Roots")               \
 292   f(full_gc_jvmti_roots,                             "    F: JVMTI Roots")              \
 293   f(full_gc_string_dedup_table_roots,                "    F: Dedup Table Roots")        \
 294   f(full_gc_string_dedup_queue_roots,                "    F: Dedup Queue Roots")        \
 295   f(full_gc_finish_queues,                           "    F: Finish Queues")            \
 296                                                                                         \
 297   f(full_gc_mark,                                    "  Mark")                          \
 298   f(full_gc_mark_finish_queues,                      "    Finish Queues")               \

 299   f(full_gc_weakrefs,                                "    Weak References")             \
 300   f(full_gc_weakrefs_process,                        "      Process")                   \

 301   f(full_gc_purge,                                   "    System Purge")                \
 302   f(full_gc_purge_class_unload,                      "      Unload Classes")            \
 303   f(full_gc_purge_par,                               "    Parallel Cleanup")            \
 304   f(full_gc_purge_cldg,                              "    CLDG")                        \
 305   f(full_gc_calculate_addresses,                     "  Calculate Addresses")           \
 306   f(full_gc_calculate_addresses_regular,             "    Regular Objects")             \
 307   f(full_gc_calculate_addresses_humong,              "    Humongous Objects")           \
 308   f(full_gc_adjust_pointers,                         "  Adjust Pointers")               \
 309   f(full_gc_copy_objects,                            "  Copy Objects")                  \
 310   f(full_gc_copy_objects_regular,                    "    Regular Objects")             \
 311   f(full_gc_copy_objects_humong,                     "    Humongous Objects")           \
 312   f(full_gc_copy_objects_reset_complete,             "    Reset Complete Bitmap")       \
 313   f(full_gc_copy_objects_rebuild,                    "    Rebuild Region Sets")         \
 314   f(full_gc_resize_tlabs,                            "  Resize TLABs")                  \
 315                                                                                         \
 316   /* Longer concurrent phases at the end */                                             \
 317   f(conc_reset,                                      "Concurrent Reset")                \
 318   f(conc_mark,                                       "Concurrent Marking")              \

 319   f(conc_preclean,                                   "Concurrent Precleaning")          \
 320   f(conc_roots,                                      "Concurrent Roots")                \
 321   f(conc_evac,                                       "Concurrent Evacuation")           \
 322   f(conc_update_refs,                                "Concurrent Update Refs")          \
 323   f(conc_cleanup,                                    "Concurrent Cleanup")              \
 324   f(conc_traversal,                                  "Concurrent Traversal")            \

 325                                                                                         \
 326   f(conc_uncommit,                                   "Concurrent Uncommit")             \
 327                                                                                         \
 328   /* Unclassified */                                                                    \
 329   f(pause_other,                                     "Pause Other")                     \
 330   f(conc_other,                                      "Concurrent Other")                \
 331   // end
 332 
 333 #define SHENANDOAH_GC_PAR_PHASE_DO(f)                           \
 334   f(ThreadRoots,              "Thread Roots (ms):")              \
 335   f(CodeCacheRoots,           "CodeCache Roots (ms):")           \
 336   f(UniverseRoots,            "Universe Roots (ms):")            \
 337   f(JNIRoots,                 "JNI Handles Roots (ms):")         \
 338   f(JVMTIWeakRoots,           "JVMTI Weak Roots (ms):")          \
 339   f(JFRWeakRoots,             "JFR Weak Roots (ms):")            \
 340   f(JNIWeakRoots,             "JNI Weak Roots (ms):")            \
 341   f(StringTableRoots,         "StringTable Roots(ms):")          \
 342   f(ResolvedMethodTableRoots, "Resolved Table Roots(ms):")       \
 343   f(VMGlobalRoots,            "VM Global Roots(ms)")             \
 344   f(VMWeakRoots,              "VM Weak Roots(ms)")               \


 365   // init_evac, final_update_refs_roots and full_gc_roots).
 366   // Make sure they are following this order.
 367   enum GCParPhases {
 368     SHENANDOAH_GC_PAR_PHASE_DO(GC_PHASE_DECLARE_ENUM)
 369     GCParPhasesSentinel
 370   };
 371 
 372 #undef GC_PHASE_DECLARE_ENUM
 373 
 374 private:
 375   struct TimingData {
 376     HdrSeq _secs;
 377     double _start;
 378   };
 379 
 380 private:
 381   TimingData          _timing_data[_num_phases];
 382   static const char*  _phase_names[_num_phases];
 383 
 384   ShenandoahWorkerTimings*      _worker_times;

 385 
 386   ShenandoahCollectorPolicy* _policy;
 387 
 388 public:
 389   ShenandoahPhaseTimings();
 390 
 391   ShenandoahWorkerTimings* const worker_times() const { return _worker_times; }

 392 
 393   // record phase start
 394   void record_phase_start(Phase phase);
 395   // record phase end and return elapsed time in seconds for the phase
 396   void record_phase_end(Phase phase);
 397   // record an elapsed time for the phase
 398   void record_phase_time(Phase phase, double time);
 399 
 400   void record_workers_start(Phase phase);
 401   void record_workers_end(Phase phase);
 402 
 403   static const char* phase_name(Phase phase) {
 404     assert(phase >= 0 && phase < _num_phases, "Out of bound");
 405     return _phase_names[phase];
 406   }
 407 
 408   void print_on(outputStream* out) const;
 409 
 410 private:
 411   void init_phase_names();
 412   void print_summary_sd(outputStream* out, const char* str, const HdrSeq* seq) const;
 413 };
 414 
 415 class ShenandoahWorkerTimings : public CHeapObj<mtGC> {
 416 private:
 417   uint _max_gc_threads;
 418   WorkerDataArray<double>* _gc_par_phases[ShenandoahPhaseTimings::GCParPhasesSentinel];
 419 
 420 public:
 421   ShenandoahWorkerTimings(uint max_gc_threads);
 422 
 423   // record the time a phase took in seconds
 424   void record_time_secs(ShenandoahPhaseTimings::GCParPhases phase, uint worker_i, double secs);
 425 
 426   double average(uint i) const;
 427   void reset(uint i);















 428   void print() const;
 429 };
 430 
 431 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHPHASETIMINGS_HPP
< prev index next >