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

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

author
neugens
date
Mon, 19 Aug 2019 10:11:31 +0200
changeset 9861
a248d0be1309
parent 9327
f96fcd9e1e1b
child 9448
73d689add964
permissions
-rw-r--r--

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

     1 /*
     2  * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  *
    23  */
    25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1ERGOVERBOSE_HPP
    26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1ERGOVERBOSE_HPP
    28 #include "memory/allocation.hpp"
    29 #include "utilities/debug.hpp"
    31 // The log of G1's heuristic decisions comprises of a series of
    32 // records which have a similar format in order to maintain
    33 // consistency across records and ultimately easier parsing of the
    34 // output, if we ever choose to do that. Each record consists of:
    35 // * A time stamp to be able to easily correlate each record with
    36 // other events.
    37 // * A unique string to allow us to easily identify such records.
    38 // * The name of the heuristic the record corresponds to.
    39 // * An action string which describes the action that G1 did or is
    40 // about to do.
    41 // * An optional reason string which describes the reason for the
    42 // action.
    43 // * An optional number of name/value pairs which contributed to the
    44 // decision to take the action described in the record.
    45 //
    46 // Each record is associated with a "tag" which is the combination of
    47 // the heuristic the record corresponds to, as well as the min level
    48 // of verboseness at which the record should be printed. The tag is
    49 // checked against the current settings to determine whether the record
    50 // should be printed or not.
    52 // The available verboseness levels.
    53 typedef enum {
    54   // Determine which part of the tag is occupied by the level.
    55   ErgoLevelShift = 8,
    56   ErgoLevelMask = ~((1 << ErgoLevelShift) - 1),
    58   // ErgoLow is 0 so that we don't have to explicitly or a heuristic
    59   // id with ErgoLow to keep its use simpler.
    60   ErgoLow = 0,
    61   ErgoHigh = 1 << ErgoLevelShift
    62 } ErgoLevel;
    64 // The available heuristics.
    65 typedef enum {
    66   // Determines which part of the tag is occupied by the heuristic id.
    67   ErgoHeuristicMask = ~ErgoLevelMask,
    69   ErgoHeapSizing = 0,
    70   ErgoCSetConstruction,
    71   ErgoConcCycles,
    72   ErgoMixedGCs,
    74   ErgoHeuristicNum
    75 } ErgoHeuristic;
    77 class G1ErgoVerbose : AllStatic {
    78 private:
    79   // Determines the minimum verboseness level at which records will be
    80   // printed.
    81   static ErgoLevel _level;
    82   // Determines which heuristics are currently enabled.
    83   static bool _enabled[ErgoHeuristicNum];
    85   static ErgoLevel extract_level(int tag) {
    86     return (ErgoLevel) (tag & ErgoLevelMask);
    87   }
    89   static ErgoHeuristic extract_heuristic(int tag) {
    90     return (ErgoHeuristic) (tag & ErgoHeuristicMask);
    91   }
    93 public:
    94   // Needs to be explicitly called at GC initialization.
    95   static void initialize();
    97   static void set_level(ErgoLevel level);
    98   static void set_enabled(ErgoHeuristic h, bool enabled);
    99   // It is applied to all heuristics.
   100   static void set_enabled(bool enabled);
   102   static bool enabled(int tag) {
   103     ErgoLevel level = extract_level(tag);
   104     ErgoHeuristic n = extract_heuristic(tag);
   105     return level <= _level && _enabled[n];
   106   }
   108   // Extract the heuristic id from the tag and return a string with
   109   // its name.
   110   static const char* to_string(int tag);
   111 };
   113 // The macros below generate the format string for values of different
   114 // types and/or metrics.
   116 // The reason for the action is optional and is handled specially: the
   117 // reason string is concatenated here so it's not necessary to pass it
   118 // as a parameter.
   119 #define ergo_format_reason(_reason_) ", reason: " _reason_
   121 // Single parameter format strings
   122 #define ergo_format_str(_name_)      ", " _name_ ": %s"
   123 #define ergo_format_region(_name_)   ", " _name_ ": %u regions"
   124 #define ergo_format_byte(_name_)     ", " _name_ ": " SIZE_FORMAT " bytes"
   125 #define ergo_format_double(_name_)   ", " _name_ ": %1.2f"
   126 #define ergo_format_perc(_name_)     ", " _name_ ": %1.2f %%"
   127 #define ergo_format_ms(_name_)       ", " _name_ ": %1.2f ms"
   128 #define ergo_format_size(_name_)     ", " _name_ ": " SIZE_FORMAT
   130 // Double parameter format strings
   131 #define ergo_format_byte_perc(_name_)                                   \
   132                              ", " _name_ ": " SIZE_FORMAT " bytes (%1.2f %%)"
   134 // Generates the format string
   135 #define ergo_format(_extra_format_)                           \
   136   " %1.3f: [G1Ergonomics (%s) %s" _extra_format_ "]"
   138 // Conditionally, prints an ergonomic decision record. _extra_format_
   139 // is the format string for the optional items we'd like to print
   140 // (i.e., the decision's reason and any associated values). This
   141 // string should be built up using the ergo_*_format macros (see
   142 // above) to ensure consistency.
   143 //
   144 // Since we cannot rely on the compiler supporting variable argument
   145 // macros, this macro accepts a fixed number of arguments and passes
   146 // them to the print method. For convenience, we have wrapper macros
   147 // below which take a specific number of arguments and set the rest to
   148 // a default value.
   149 #define ergo_verbose_common(_tag_, _action_, _extra_format_,                \
   150                             _arg0_, _arg1_, _arg2_, _arg3_, _arg4_, _arg5_) \
   151   do {                                                                      \
   152     if (G1ErgoVerbose::enabled((_tag_))) {                                  \
   153       gclog_or_tty->print_cr(ergo_format(_extra_format_),                   \
   154                              os::elapsedTime(),                             \
   155                              G1ErgoVerbose::to_string((_tag_)),             \
   156                              (_action_),                                    \
   157                              (_arg0_), (_arg1_), (_arg2_),                  \
   158                              (_arg3_), (_arg4_), (_arg5_));                 \
   159     }                                                                       \
   160   } while (0)
   163 #define ergo_verbose(_tag_, _action_)                                   \
   164   ergo_verbose_common(_tag_, _action_, "", 0, 0, 0, 0, 0, 0)
   166 #define ergo_verbose0(_tag_, _action_, _extra_format_)                  \
   167   ergo_verbose_common(_tag_, _action_, _extra_format_, 0, 0, 0, 0, 0, 0)
   169 #define ergo_verbose1(_tag_, _action_, _extra_format_,                  \
   170                       _arg0_)                                           \
   171   ergo_verbose_common(_tag_, _action_, _extra_format_,                  \
   172                       _arg0_, 0, 0, 0, 0, 0)
   174 #define ergo_verbose2(_tag_, _action_, _extra_format_,                  \
   175                       _arg0_, _arg1_)                                   \
   176   ergo_verbose_common(_tag_, _action_, _extra_format_,                  \
   177                       _arg0_, _arg1_, 0, 0, 0, 0)
   179 #define ergo_verbose3(_tag_, _action_, _extra_format_,                  \
   180                       _arg0_, _arg1_, _arg2_)                           \
   181   ergo_verbose_common(_tag_, _action_, _extra_format_,                  \
   182                       _arg0_, _arg1_, _arg2_, 0, 0, 0)
   184 #define ergo_verbose4(_tag_, _action_, _extra_format_,                  \
   185                       _arg0_, _arg1_, _arg2_, _arg3_)                   \
   186   ergo_verbose_common(_tag_, _action_, _extra_format_,                  \
   187                       _arg0_, _arg1_, _arg2_, _arg3_, 0, 0)
   189 #define ergo_verbose5(_tag_, _action_, _extra_format_,                  \
   190                       _arg0_, _arg1_, _arg2_, _arg3_, _arg4_)           \
   191   ergo_verbose_common(_tag_, _action_, _extra_format_,                  \
   192                       _arg0_, _arg1_, _arg2_, _arg3_, _arg4_, 0)
   194 #define ergo_verbose6(_tag_, _action_, _extra_format_,                  \
   195                       _arg0_, _arg1_, _arg2_, _arg3_, _arg4_, _arg5_)   \
   196   ergo_verbose_common(_tag_, _action_, _extra_format_,                  \
   197                       _arg0_, _arg1_, _arg2_, _arg3_, _arg4_, _arg5_)
   199 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1ERGOVERBOSE_HPP

mercurial