src/share/vm/services/diagnosticCommand.hpp

Wed, 27 Aug 2014 08:19:12 -0400

author
zgu
date
Wed, 27 Aug 2014 08:19:12 -0400
changeset 7074
833b0f92429a
parent 6535
f42c10a3d4b1
child 6876
710a3c8b516e
child 8303
767f8c68255a
permissions
-rw-r--r--

8046598: Scalable Native memory tracking development
Summary: Enhance scalability of native memory tracking
Reviewed-by: coleenp, ctornqvi, gtriantafill

     1 /*
     2  * Copyright (c) 2011, 2013, 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 VMUptimeDCmd : public DCmdWithParser {
   136 protected:
   137   DCmdArgument<bool> _date;
   138 public:
   139   VMUptimeDCmd(outputStream* output, bool heap);
   140   static const char* name() { return "VM.uptime"; }
   141   static const char* description() {
   142     return "Print VM uptime.";
   143   }
   144   static const char* impact() {
   145     return "Low";
   146   }
   147   static int num_arguments();
   148   virtual void execute(DCmdSource source, TRAPS);
   149 };
   151 class SystemGCDCmd : public DCmd {
   152 public:
   153   SystemGCDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
   154     static const char* name() { return "GC.run"; }
   155     static const char* description() {
   156       return "Call java.lang.System.gc().";
   157     }
   158     static const char* impact() {
   159       return "Medium: Depends on Java heap size and content.";
   160     }
   161     static int num_arguments() { return 0; }
   162     virtual void execute(DCmdSource source, TRAPS);
   163 };
   165 class RunFinalizationDCmd : public DCmd {
   166 public:
   167   RunFinalizationDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
   168     static const char* name() { return "GC.run_finalization"; }
   169     static const char* description() {
   170       return "Call java.lang.System.runFinalization().";
   171     }
   172     static const char* impact() {
   173       return "Medium: Depends on Java content.";
   174     }
   175     static int num_arguments() { return 0; }
   176     virtual void execute(DCmdSource source, TRAPS);
   177 };
   179 #if INCLUDE_SERVICES   // Heap dumping supported
   180 // See also: dump_heap in attachListener.cpp
   181 class HeapDumpDCmd : public DCmdWithParser {
   182 protected:
   183   DCmdArgument<char*> _filename;
   184   DCmdArgument<bool>  _all;
   185 public:
   186   HeapDumpDCmd(outputStream* output, bool heap);
   187   static const char* name() {
   188     return "GC.heap_dump";
   189   }
   190   static const char* description() {
   191     return "Generate a HPROF format dump of the Java heap.";
   192   }
   193   static const char* impact() {
   194     return "High: Depends on Java heap size and content. "
   195            "Request a full GC unless the '-all' option is specified.";
   196   }
   197   static const JavaPermission permission() {
   198     JavaPermission p = {"java.lang.management.ManagementPermission",
   199                         "monitor", NULL};
   200     return p;
   201   }
   202   static int num_arguments();
   203   virtual void execute(DCmdSource source, TRAPS);
   204 };
   205 #endif // INCLUDE_SERVICES
   207 // See also: inspectheap in attachListener.cpp
   208 class ClassHistogramDCmd : public DCmdWithParser {
   209 protected:
   210   DCmdArgument<bool> _all;
   211 public:
   212   ClassHistogramDCmd(outputStream* output, bool heap);
   213   static const char* name() {
   214     return "GC.class_histogram";
   215   }
   216   static const char* description() {
   217     return "Provide statistics about the Java heap usage.";
   218   }
   219   static const char* impact() {
   220     return "High: Depends on Java heap size and content.";
   221   }
   222   static const JavaPermission permission() {
   223     JavaPermission p = {"java.lang.management.ManagementPermission",
   224                         "monitor", NULL};
   225     return p;
   226   }
   227   static int num_arguments();
   228   virtual void execute(DCmdSource source, TRAPS);
   229 };
   231 class ClassStatsDCmd : public DCmdWithParser {
   232 protected:
   233   DCmdArgument<bool> _all;
   234   DCmdArgument<bool> _csv;
   235   DCmdArgument<bool> _help;
   236   DCmdArgument<char*> _columns;
   237 public:
   238   ClassStatsDCmd(outputStream* output, bool heap);
   239   static const char* name() {
   240     return "GC.class_stats";
   241   }
   242   static const char* description() {
   243     return "Provide statistics about Java class meta data. Requires -XX:+UnlockDiagnosticVMOptions.";
   244   }
   245   static const char* impact() {
   246     return "High: Depends on Java heap size and content.";
   247   }
   248   static int num_arguments();
   249   virtual void execute(DCmdSource source, TRAPS);
   250 };
   252 // See also: thread_dump in attachListener.cpp
   253 class ThreadDumpDCmd : public DCmdWithParser {
   254 protected:
   255   DCmdArgument<bool> _locks;
   256 public:
   257   ThreadDumpDCmd(outputStream* output, bool heap);
   258   static const char* name() { return "Thread.print"; }
   259   static const char* description() {
   260     return "Print all threads with stacktraces.";
   261   }
   262   static const char* impact() {
   263     return "Medium: Depends on the number of threads.";
   264   }
   265   static const JavaPermission permission() {
   266     JavaPermission p = {"java.lang.management.ManagementPermission",
   267                         "monitor", NULL};
   268     return p;
   269   }
   270   static int num_arguments();
   271   virtual void execute(DCmdSource source, TRAPS);
   272 };
   274 // Enhanced JMX Agent support
   276 class JMXStartRemoteDCmd : public DCmdWithParser {
   278   // Explicitly list all properties that could be
   279   // passed to Agent.startRemoteManagementAgent()
   280   // com.sun.management is omitted
   282   DCmdArgument<char *> _config_file;
   283   DCmdArgument<char *> _jmxremote_port;
   284   DCmdArgument<char *> _jmxremote_rmi_port;
   285   DCmdArgument<char *> _jmxremote_ssl;
   286   DCmdArgument<char *> _jmxremote_registry_ssl;
   287   DCmdArgument<char *> _jmxremote_authenticate;
   288   DCmdArgument<char *> _jmxremote_password_file;
   289   DCmdArgument<char *> _jmxremote_access_file;
   290   DCmdArgument<char *> _jmxremote_login_config;
   291   DCmdArgument<char *> _jmxremote_ssl_enabled_cipher_suites;
   292   DCmdArgument<char *> _jmxremote_ssl_enabled_protocols;
   293   DCmdArgument<char *> _jmxremote_ssl_need_client_auth;
   294   DCmdArgument<char *> _jmxremote_ssl_config_file;
   296   // JDP support
   297   // Keep autodiscovery char* not bool to pass true/false
   298   // as property value to java level.
   299   DCmdArgument<char *> _jmxremote_autodiscovery;
   300   DCmdArgument<jlong>  _jdp_port;
   301   DCmdArgument<char *> _jdp_address;
   302   DCmdArgument<char *> _jdp_source_addr;
   303   DCmdArgument<jlong>  _jdp_ttl;
   304   DCmdArgument<jlong>  _jdp_pause;
   305   DCmdArgument<char *> _jdp_name;
   307 public:
   308   JMXStartRemoteDCmd(outputStream *output, bool heap_allocated);
   310   static const char *name() {
   311     return "ManagementAgent.start";
   312   }
   314   static const char *description() {
   315     return "Start remote management agent.";
   316   }
   318   static int num_arguments();
   320   virtual void execute(DCmdSource source, TRAPS);
   322 };
   324 class JMXStartLocalDCmd : public DCmd {
   326   // Explicitly request start of local agent,
   327   // it will not be started by start dcmd
   330 public:
   331   JMXStartLocalDCmd(outputStream *output, bool heap_allocated);
   333   static const char *name() {
   334     return "ManagementAgent.start_local";
   335   }
   337   static const char *description() {
   338     return "Start local management agent.";
   339   }
   341   virtual void execute(DCmdSource source, TRAPS);
   343 };
   345 class JMXStopRemoteDCmd : public DCmd {
   346 public:
   347   JMXStopRemoteDCmd(outputStream *output, bool heap_allocated) :
   348   DCmd(output, heap_allocated) {
   349     // Do Nothing
   350   }
   352   static const char *name() {
   353     return "ManagementAgent.stop";
   354   }
   356   static const char *description() {
   357     return "Stop remote management agent.";
   358   }
   360   virtual void execute(DCmdSource source, TRAPS);
   361 };
   363 class RotateGCLogDCmd : public DCmd {
   364 public:
   365   RotateGCLogDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}
   366   static const char* name() { return "GC.rotate_log"; }
   367   static const char* description() {
   368     return "Force the GC log file to be rotated.";
   369   }
   370   static const char* impact() { return "Low"; }
   371   virtual void execute(DCmdSource source, TRAPS);
   372   static int num_arguments() { return 0; }
   373   static const JavaPermission permission() {
   374     JavaPermission p = {"java.lang.management.ManagementPermission",
   375                         "control", NULL};
   376     return p;
   377   }
   378 };
   380 #endif // SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP

mercurial