src/share/vm/services/diagnosticCommand.hpp

Thu, 21 Dec 2017 19:11:17 -0500

author
dbuck
date
Thu, 21 Dec 2017 19:11:17 -0500
changeset 9061
d10254debf7c
parent 9059
5801df4acb84
child 9122
024be04bb151
permissions
-rw-r--r--

8031304: Add dcmd to print all loaded dynamic libraries.
Summary: Adding VM.dynlibs as a dcmd to dump all loaded dynamic libraries.
Reviewed-by: fparain, mgronlun

     1 /*
     2  * Copyright (c) 2011, 2017, 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_SERVICES_DIAGNOSTICCOMMAND_HPP
    26 #define SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP
    28 #include "runtime/arguments.hpp"
    29 #include "classfile/vmSymbols.hpp"
    30 #include "utilities/ostream.hpp"
    31 #include "runtime/vm_version.hpp"
    32 #include "runtime/vmThread.hpp"
    33 #include "runtime/os.hpp"
    34 #include "services/diagnosticArgument.hpp"
    35 #include "services/diagnosticCommand.hpp"
    36 #include "services/diagnosticFramework.hpp"
    37 #include "services/diagnosticCommand_ext.hpp"
    38 #include "utilities/macros.hpp"
    40 class HelpDCmd : public DCmdWithParser {
    41 protected:
    42   DCmdArgument<bool> _all;
    43   DCmdArgument<char*> _cmd;
    44 public:
    45   HelpDCmd(outputStream* output, bool heap);
    46   static const char* name() { return "help"; }
    47   static const char* description() {
    48     return "For more information about a specific command use 'help <command>'. "
    49            "With no argument this will show a list of available commands. "
    50            "'help all' will show help for all commands.";
    51   }
    52   static const char* impact() { return "Low"; }
    53   static int num_arguments();
    54   virtual void execute(DCmdSource source, TRAPS);
    55 };
    57 class VersionDCmd : public DCmd {
    58 public:
    59   VersionDCmd(outputStream* output, bool heap) : DCmd(output,heap) { }
    60   static const char* name() { return "VM.version"; }
    61   static const char* description() {
    62     return "Print JVM version information.";
    63   }
    64   static const char* impact() { return "Low"; }
    65   static const JavaPermission permission() {
    66     JavaPermission p = {"java.util.PropertyPermission",
    67                         "java.vm.version", "read"};
    68     return p;
    69   }
    70   static int num_arguments() { return 0; }
    71   virtual void execute(DCmdSource source, TRAPS);
    72 };
    74 class CommandLineDCmd : public DCmd {
    75 public:
    76   CommandLineDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
    77   static const char* name() { return "VM.command_line"; }
    78   static const char* description() {
    79     return "Print the command line used to start this VM instance.";
    80   }
    81   static const char* impact() { return "Low"; }
    82   static const JavaPermission permission() {
    83     JavaPermission p = {"java.lang.management.ManagementPermission",
    84                         "monitor", NULL};
    85     return p;
    86   }
    87   static int num_arguments() { return 0; }
    88   virtual void execute(DCmdSource source, TRAPS) {
    89     Arguments::print_on(_output);
    90   }
    91 };
    93 // See also: get_system_properties in attachListener.cpp
    94 class PrintSystemPropertiesDCmd : public DCmd {
    95 public:
    96   PrintSystemPropertiesDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
    97     static const char* name() { return "VM.system_properties"; }
    98     static const char* description() {
    99       return "Print system properties.";
   100     }
   101     static const char* impact() {
   102       return "Low";
   103     }
   104     static const JavaPermission permission() {
   105       JavaPermission p = {"java.util.PropertyPermission",
   106                           "*", "read"};
   107       return p;
   108     }
   109     static int num_arguments() { return 0; }
   110     virtual void execute(DCmdSource source, TRAPS);
   111 };
   113 // See also: print_flag in attachListener.cpp
   114 class PrintVMFlagsDCmd : public DCmdWithParser {
   115 protected:
   116   DCmdArgument<bool> _all;
   117 public:
   118   PrintVMFlagsDCmd(outputStream* output, bool heap);
   119   static const char* name() { return "VM.flags"; }
   120   static const char* description() {
   121     return "Print VM flag options and their current values.";
   122   }
   123   static const char* impact() {
   124     return "Low";
   125   }
   126   static const JavaPermission permission() {
   127     JavaPermission p = {"java.lang.management.ManagementPermission",
   128                         "monitor", NULL};
   129     return p;
   130   }
   131   static int num_arguments();
   132   virtual void execute(DCmdSource source, TRAPS);
   133 };
   135 class VMDynamicLibrariesDCmd : public DCmd {
   136 public:
   137   VMDynamicLibrariesDCmd(outputStream* output, bool heap);
   138   static const char* name() {
   139     return "VM.dynlibs";
   140   }
   141   static const char* description() {
   142     return "Print loaded dynamic libraries.";
   143   }
   144   static const char* impact() {
   145     return "Low";
   146   }
   147   static const JavaPermission permission() {
   148     JavaPermission p = {"java.lang.management.ManagementPermission",
   149                         "monitor", NULL};
   150     return p;
   151   }
   152   static int num_arguments() {
   153     return 0;
   154   };
   155   virtual void execute(DCmdSource source, TRAPS);
   156 };
   158 class VMUptimeDCmd : public DCmdWithParser {
   159 protected:
   160   DCmdArgument<bool> _date;
   161 public:
   162   VMUptimeDCmd(outputStream* output, bool heap);
   163   static const char* name() { return "VM.uptime"; }
   164   static const char* description() {
   165     return "Print VM uptime.";
   166   }
   167   static const char* impact() {
   168     return "Low";
   169   }
   170   static int num_arguments();
   171   virtual void execute(DCmdSource source, TRAPS);
   172 };
   174 class SystemGCDCmd : public DCmd {
   175 public:
   176   SystemGCDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
   177     static const char* name() { return "GC.run"; }
   178     static const char* description() {
   179       return "Call java.lang.System.gc().";
   180     }
   181     static const char* impact() {
   182       return "Medium: Depends on Java heap size and content.";
   183     }
   184     static int num_arguments() { return 0; }
   185     virtual void execute(DCmdSource source, TRAPS);
   186 };
   188 class RunFinalizationDCmd : public DCmd {
   189 public:
   190   RunFinalizationDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
   191     static const char* name() { return "GC.run_finalization"; }
   192     static const char* description() {
   193       return "Call java.lang.System.runFinalization().";
   194     }
   195     static const char* impact() {
   196       return "Medium: Depends on Java content.";
   197     }
   198     static int num_arguments() { return 0; }
   199     virtual void execute(DCmdSource source, TRAPS);
   200 };
   202 class HeapInfoDCmd : public DCmd {
   203 public:
   204   HeapInfoDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
   205   static const char* name() { return "GC.heap_info"; }
   206   static const char* description() {
   207     return "Provide generic Java heap information.";
   208   }
   209   static const char* impact() {
   210     return "Medium";
   211   }
   212   static int num_arguments() { return 0; }
   213   static const JavaPermission permission() {
   214     JavaPermission p = {"java.lang.management.ManagementPermission",
   215       "monitor", NULL};
   216       return p;
   217   }
   219   virtual void execute(DCmdSource source, TRAPS);
   220 };
   222 class FinalizerInfoDCmd : public DCmd {
   223 public:
   224   FinalizerInfoDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
   225   static const char* name() { return "GC.finalizer_info"; }
   226   static const char* description() {
   227     return "Provide information about Java finalization queue.";
   228   }
   229   static const char* impact() {
   230     return "Medium";
   231   }
   232   static int num_arguments() { return 0; }
   233   static const JavaPermission permission() {
   234     JavaPermission p = {"java.lang.management.ManagementPermission",
   235       "monitor", NULL};
   236       return p;
   237   }
   239   virtual void execute(DCmdSource source, TRAPS);
   240 };
   242 #if INCLUDE_SERVICES   // Heap dumping supported
   243 // See also: dump_heap in attachListener.cpp
   244 class HeapDumpDCmd : public DCmdWithParser {
   245 protected:
   246   DCmdArgument<char*> _filename;
   247   DCmdArgument<bool>  _all;
   248 public:
   249   HeapDumpDCmd(outputStream* output, bool heap);
   250   static const char* name() {
   251     return "GC.heap_dump";
   252   }
   253   static const char* description() {
   254     return "Generate a HPROF format dump of the Java heap.";
   255   }
   256   static const char* impact() {
   257     return "High: Depends on Java heap size and content. "
   258            "Request a full GC unless the '-all' option is specified.";
   259   }
   260   static const JavaPermission permission() {
   261     JavaPermission p = {"java.lang.management.ManagementPermission",
   262                         "monitor", NULL};
   263     return p;
   264   }
   265   static int num_arguments();
   266   virtual void execute(DCmdSource source, TRAPS);
   267 };
   268 #endif // INCLUDE_SERVICES
   270 // See also: inspectheap in attachListener.cpp
   271 class ClassHistogramDCmd : public DCmdWithParser {
   272 protected:
   273   DCmdArgument<bool> _all;
   274 public:
   275   ClassHistogramDCmd(outputStream* output, bool heap);
   276   static const char* name() {
   277     return "GC.class_histogram";
   278   }
   279   static const char* description() {
   280     return "Provide statistics about the Java heap usage.";
   281   }
   282   static const char* impact() {
   283     return "High: Depends on Java heap size and content.";
   284   }
   285   static const JavaPermission permission() {
   286     JavaPermission p = {"java.lang.management.ManagementPermission",
   287                         "monitor", NULL};
   288     return p;
   289   }
   290   static int num_arguments();
   291   virtual void execute(DCmdSource source, TRAPS);
   292 };
   294 class ClassStatsDCmd : public DCmdWithParser {
   295 protected:
   296   DCmdArgument<bool> _all;
   297   DCmdArgument<bool> _csv;
   298   DCmdArgument<bool> _help;
   299   DCmdArgument<char*> _columns;
   300 public:
   301   ClassStatsDCmd(outputStream* output, bool heap);
   302   static const char* name() {
   303     return "GC.class_stats";
   304   }
   305   static const char* description() {
   306     return "Provide statistics about Java class meta data. Requires -XX:+UnlockDiagnosticVMOptions.";
   307   }
   308   static const char* impact() {
   309     return "High: Depends on Java heap size and content.";
   310   }
   311   static int num_arguments();
   312   virtual void execute(DCmdSource source, TRAPS);
   313 };
   315 // See also: thread_dump in attachListener.cpp
   316 class ThreadDumpDCmd : public DCmdWithParser {
   317 protected:
   318   DCmdArgument<bool> _locks;
   319 public:
   320   ThreadDumpDCmd(outputStream* output, bool heap);
   321   static const char* name() { return "Thread.print"; }
   322   static const char* description() {
   323     return "Print all threads with stacktraces.";
   324   }
   325   static const char* impact() {
   326     return "Medium: Depends on the number of threads.";
   327   }
   328   static const JavaPermission permission() {
   329     JavaPermission p = {"java.lang.management.ManagementPermission",
   330                         "monitor", NULL};
   331     return p;
   332   }
   333   static int num_arguments();
   334   virtual void execute(DCmdSource source, TRAPS);
   335 };
   337 // Enhanced JMX Agent support
   339 class JMXStartRemoteDCmd : public DCmdWithParser {
   341   // Explicitly list all properties that could be
   342   // passed to Agent.startRemoteManagementAgent()
   343   // com.sun.management is omitted
   345   DCmdArgument<char *> _config_file;
   346   DCmdArgument<char *> _jmxremote_host;
   347   DCmdArgument<char *> _jmxremote_port;
   348   DCmdArgument<char *> _jmxremote_rmi_port;
   349   DCmdArgument<char *> _jmxremote_ssl;
   350   DCmdArgument<char *> _jmxremote_registry_ssl;
   351   DCmdArgument<char *> _jmxremote_authenticate;
   352   DCmdArgument<char *> _jmxremote_password_file;
   353   DCmdArgument<char *> _jmxremote_access_file;
   354   DCmdArgument<char *> _jmxremote_login_config;
   355   DCmdArgument<char *> _jmxremote_ssl_enabled_cipher_suites;
   356   DCmdArgument<char *> _jmxremote_ssl_enabled_protocols;
   357   DCmdArgument<char *> _jmxremote_ssl_need_client_auth;
   358   DCmdArgument<char *> _jmxremote_ssl_config_file;
   360   // JDP support
   361   // Keep autodiscovery char* not bool to pass true/false
   362   // as property value to java level.
   363   DCmdArgument<char *> _jmxremote_autodiscovery;
   364   DCmdArgument<jlong>  _jdp_port;
   365   DCmdArgument<char *> _jdp_address;
   366   DCmdArgument<char *> _jdp_source_addr;
   367   DCmdArgument<jlong>  _jdp_ttl;
   368   DCmdArgument<jlong>  _jdp_pause;
   369   DCmdArgument<char *> _jdp_name;
   371 public:
   372   JMXStartRemoteDCmd(outputStream *output, bool heap_allocated);
   374   static const char *name() {
   375     return "ManagementAgent.start";
   376   }
   378   static const char *description() {
   379     return "Start remote management agent.";
   380   }
   382   static int num_arguments();
   384   virtual void execute(DCmdSource source, TRAPS);
   386 };
   388 class JMXStartLocalDCmd : public DCmd {
   390   // Explicitly request start of local agent,
   391   // it will not be started by start dcmd
   394 public:
   395   JMXStartLocalDCmd(outputStream *output, bool heap_allocated);
   397   static const char *name() {
   398     return "ManagementAgent.start_local";
   399   }
   401   static const char *description() {
   402     return "Start local management agent.";
   403   }
   405   virtual void execute(DCmdSource source, TRAPS);
   407 };
   409 class JMXStopRemoteDCmd : public DCmd {
   410 public:
   411   JMXStopRemoteDCmd(outputStream *output, bool heap_allocated) :
   412   DCmd(output, heap_allocated) {
   413     // Do Nothing
   414   }
   416   static const char *name() {
   417     return "ManagementAgent.stop";
   418   }
   420   static const char *description() {
   421     return "Stop remote management agent.";
   422   }
   424   virtual void execute(DCmdSource source, TRAPS);
   425 };
   427 class RotateGCLogDCmd : public DCmd {
   428 public:
   429   RotateGCLogDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}
   430   static const char* name() { return "GC.rotate_log"; }
   431   static const char* description() {
   432     return "Force the GC log file to be rotated.";
   433   }
   434   static const char* impact() { return "Low"; }
   435   virtual void execute(DCmdSource source, TRAPS);
   436   static int num_arguments() { return 0; }
   437   static const JavaPermission permission() {
   438     JavaPermission p = {"java.lang.management.ManagementPermission",
   439                         "control", NULL};
   440     return p;
   441   }
   442 };
   444 #endif // SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP

mercurial