src/share/vm/services/diagnosticCommand.hpp

Thu, 24 May 2018 17:06:56 +0800

author
aoqi
date
Thu, 24 May 2018 17:06:56 +0800
changeset 8604
04d83ba48607
parent 8303
767f8c68255a
parent 6876
710a3c8b516e
child 9122
024be04bb151
permissions
-rw-r--r--

Merge

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation.
aoqi@0 8 *
aoqi@0 9 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 12 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 13 * accompanied this code).
aoqi@0 14 *
aoqi@0 15 * You should have received a copy of the GNU General Public License version
aoqi@0 16 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 18 *
aoqi@0 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 20 * or visit www.oracle.com if you need additional information or have any
aoqi@0 21 * questions.
aoqi@0 22 *
aoqi@0 23 */
aoqi@0 24
aoqi@0 25 #ifndef SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP
aoqi@0 26 #define SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP
aoqi@0 27
aoqi@0 28 #include "runtime/arguments.hpp"
aoqi@0 29 #include "classfile/vmSymbols.hpp"
aoqi@0 30 #include "utilities/ostream.hpp"
aoqi@0 31 #include "runtime/vm_version.hpp"
aoqi@0 32 #include "runtime/vmThread.hpp"
aoqi@0 33 #include "runtime/os.hpp"
aoqi@0 34 #include "services/diagnosticArgument.hpp"
aoqi@0 35 #include "services/diagnosticCommand.hpp"
aoqi@0 36 #include "services/diagnosticFramework.hpp"
aoqi@0 37 #include "services/diagnosticCommand_ext.hpp"
aoqi@0 38 #include "utilities/macros.hpp"
aoqi@0 39
aoqi@0 40 class HelpDCmd : public DCmdWithParser {
aoqi@0 41 protected:
aoqi@0 42 DCmdArgument<bool> _all;
aoqi@0 43 DCmdArgument<char*> _cmd;
aoqi@0 44 public:
aoqi@0 45 HelpDCmd(outputStream* output, bool heap);
aoqi@0 46 static const char* name() { return "help"; }
aoqi@0 47 static const char* description() {
aoqi@0 48 return "For more information about a specific command use 'help <command>'. "
aoqi@0 49 "With no argument this will show a list of available commands. "
aoqi@0 50 "'help all' will show help for all commands.";
aoqi@0 51 }
aoqi@0 52 static const char* impact() { return "Low"; }
aoqi@0 53 static int num_arguments();
aoqi@0 54 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 55 };
aoqi@0 56
aoqi@0 57 class VersionDCmd : public DCmd {
aoqi@0 58 public:
aoqi@0 59 VersionDCmd(outputStream* output, bool heap) : DCmd(output,heap) { }
aoqi@0 60 static const char* name() { return "VM.version"; }
aoqi@0 61 static const char* description() {
aoqi@0 62 return "Print JVM version information.";
aoqi@0 63 }
aoqi@0 64 static const char* impact() { return "Low"; }
aoqi@0 65 static const JavaPermission permission() {
aoqi@0 66 JavaPermission p = {"java.util.PropertyPermission",
aoqi@0 67 "java.vm.version", "read"};
aoqi@0 68 return p;
aoqi@0 69 }
aoqi@0 70 static int num_arguments() { return 0; }
aoqi@0 71 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 72 };
aoqi@0 73
aoqi@0 74 class CommandLineDCmd : public DCmd {
aoqi@0 75 public:
aoqi@0 76 CommandLineDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
aoqi@0 77 static const char* name() { return "VM.command_line"; }
aoqi@0 78 static const char* description() {
aoqi@0 79 return "Print the command line used to start this VM instance.";
aoqi@0 80 }
aoqi@0 81 static const char* impact() { return "Low"; }
aoqi@0 82 static const JavaPermission permission() {
aoqi@0 83 JavaPermission p = {"java.lang.management.ManagementPermission",
aoqi@0 84 "monitor", NULL};
aoqi@0 85 return p;
aoqi@0 86 }
aoqi@0 87 static int num_arguments() { return 0; }
aoqi@0 88 virtual void execute(DCmdSource source, TRAPS) {
aoqi@0 89 Arguments::print_on(_output);
aoqi@0 90 }
aoqi@0 91 };
aoqi@0 92
aoqi@0 93 // See also: get_system_properties in attachListener.cpp
aoqi@0 94 class PrintSystemPropertiesDCmd : public DCmd {
aoqi@0 95 public:
aoqi@0 96 PrintSystemPropertiesDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
aoqi@0 97 static const char* name() { return "VM.system_properties"; }
aoqi@0 98 static const char* description() {
aoqi@0 99 return "Print system properties.";
aoqi@0 100 }
aoqi@0 101 static const char* impact() {
aoqi@0 102 return "Low";
aoqi@0 103 }
aoqi@0 104 static const JavaPermission permission() {
aoqi@0 105 JavaPermission p = {"java.util.PropertyPermission",
aoqi@0 106 "*", "read"};
aoqi@0 107 return p;
aoqi@0 108 }
aoqi@0 109 static int num_arguments() { return 0; }
aoqi@0 110 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 111 };
aoqi@0 112
aoqi@0 113 // See also: print_flag in attachListener.cpp
aoqi@0 114 class PrintVMFlagsDCmd : public DCmdWithParser {
aoqi@0 115 protected:
aoqi@0 116 DCmdArgument<bool> _all;
aoqi@0 117 public:
aoqi@0 118 PrintVMFlagsDCmd(outputStream* output, bool heap);
aoqi@0 119 static const char* name() { return "VM.flags"; }
aoqi@0 120 static const char* description() {
aoqi@0 121 return "Print VM flag options and their current values.";
aoqi@0 122 }
aoqi@0 123 static const char* impact() {
aoqi@0 124 return "Low";
aoqi@0 125 }
aoqi@0 126 static const JavaPermission permission() {
aoqi@0 127 JavaPermission p = {"java.lang.management.ManagementPermission",
aoqi@0 128 "monitor", NULL};
aoqi@0 129 return p;
aoqi@0 130 }
aoqi@0 131 static int num_arguments();
aoqi@0 132 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 133 };
aoqi@0 134
aoqi@0 135 class VMUptimeDCmd : public DCmdWithParser {
aoqi@0 136 protected:
aoqi@0 137 DCmdArgument<bool> _date;
aoqi@0 138 public:
aoqi@0 139 VMUptimeDCmd(outputStream* output, bool heap);
aoqi@0 140 static const char* name() { return "VM.uptime"; }
aoqi@0 141 static const char* description() {
aoqi@0 142 return "Print VM uptime.";
aoqi@0 143 }
aoqi@0 144 static const char* impact() {
aoqi@0 145 return "Low";
aoqi@0 146 }
aoqi@0 147 static int num_arguments();
aoqi@0 148 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 149 };
aoqi@0 150
aoqi@0 151 class SystemGCDCmd : public DCmd {
aoqi@0 152 public:
aoqi@0 153 SystemGCDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
aoqi@0 154 static const char* name() { return "GC.run"; }
aoqi@0 155 static const char* description() {
aoqi@0 156 return "Call java.lang.System.gc().";
aoqi@0 157 }
aoqi@0 158 static const char* impact() {
aoqi@0 159 return "Medium: Depends on Java heap size and content.";
aoqi@0 160 }
aoqi@0 161 static int num_arguments() { return 0; }
aoqi@0 162 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 163 };
aoqi@0 164
aoqi@0 165 class RunFinalizationDCmd : public DCmd {
aoqi@0 166 public:
aoqi@0 167 RunFinalizationDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
aoqi@0 168 static const char* name() { return "GC.run_finalization"; }
aoqi@0 169 static const char* description() {
aoqi@0 170 return "Call java.lang.System.runFinalization().";
aoqi@0 171 }
aoqi@0 172 static const char* impact() {
aoqi@0 173 return "Medium: Depends on Java content.";
aoqi@0 174 }
aoqi@0 175 static int num_arguments() { return 0; }
aoqi@0 176 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 177 };
aoqi@0 178
aoqi@0 179 #if INCLUDE_SERVICES // Heap dumping supported
aoqi@0 180 // See also: dump_heap in attachListener.cpp
aoqi@0 181 class HeapDumpDCmd : public DCmdWithParser {
aoqi@0 182 protected:
aoqi@0 183 DCmdArgument<char*> _filename;
aoqi@0 184 DCmdArgument<bool> _all;
aoqi@0 185 public:
aoqi@0 186 HeapDumpDCmd(outputStream* output, bool heap);
aoqi@0 187 static const char* name() {
aoqi@0 188 return "GC.heap_dump";
aoqi@0 189 }
aoqi@0 190 static const char* description() {
aoqi@0 191 return "Generate a HPROF format dump of the Java heap.";
aoqi@0 192 }
aoqi@0 193 static const char* impact() {
aoqi@0 194 return "High: Depends on Java heap size and content. "
aoqi@0 195 "Request a full GC unless the '-all' option is specified.";
aoqi@0 196 }
aoqi@0 197 static const JavaPermission permission() {
aoqi@0 198 JavaPermission p = {"java.lang.management.ManagementPermission",
aoqi@0 199 "monitor", NULL};
aoqi@0 200 return p;
aoqi@0 201 }
aoqi@0 202 static int num_arguments();
aoqi@0 203 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 204 };
aoqi@0 205 #endif // INCLUDE_SERVICES
aoqi@0 206
aoqi@0 207 // See also: inspectheap in attachListener.cpp
aoqi@0 208 class ClassHistogramDCmd : public DCmdWithParser {
aoqi@0 209 protected:
aoqi@0 210 DCmdArgument<bool> _all;
aoqi@0 211 public:
aoqi@0 212 ClassHistogramDCmd(outputStream* output, bool heap);
aoqi@0 213 static const char* name() {
aoqi@0 214 return "GC.class_histogram";
aoqi@0 215 }
aoqi@0 216 static const char* description() {
aoqi@0 217 return "Provide statistics about the Java heap usage.";
aoqi@0 218 }
aoqi@0 219 static const char* impact() {
aoqi@0 220 return "High: Depends on Java heap size and content.";
aoqi@0 221 }
aoqi@0 222 static const JavaPermission permission() {
aoqi@0 223 JavaPermission p = {"java.lang.management.ManagementPermission",
aoqi@0 224 "monitor", NULL};
aoqi@0 225 return p;
aoqi@0 226 }
aoqi@0 227 static int num_arguments();
aoqi@0 228 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 229 };
aoqi@0 230
aoqi@0 231 class ClassStatsDCmd : public DCmdWithParser {
aoqi@0 232 protected:
aoqi@0 233 DCmdArgument<bool> _all;
aoqi@0 234 DCmdArgument<bool> _csv;
aoqi@0 235 DCmdArgument<bool> _help;
aoqi@0 236 DCmdArgument<char*> _columns;
aoqi@0 237 public:
aoqi@0 238 ClassStatsDCmd(outputStream* output, bool heap);
aoqi@0 239 static const char* name() {
aoqi@0 240 return "GC.class_stats";
aoqi@0 241 }
aoqi@0 242 static const char* description() {
aoqi@0 243 return "Provide statistics about Java class meta data. Requires -XX:+UnlockDiagnosticVMOptions.";
aoqi@0 244 }
aoqi@0 245 static const char* impact() {
aoqi@0 246 return "High: Depends on Java heap size and content.";
aoqi@0 247 }
aoqi@0 248 static int num_arguments();
aoqi@0 249 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 250 };
aoqi@0 251
aoqi@0 252 // See also: thread_dump in attachListener.cpp
aoqi@0 253 class ThreadDumpDCmd : public DCmdWithParser {
aoqi@0 254 protected:
aoqi@0 255 DCmdArgument<bool> _locks;
aoqi@0 256 public:
aoqi@0 257 ThreadDumpDCmd(outputStream* output, bool heap);
aoqi@0 258 static const char* name() { return "Thread.print"; }
aoqi@0 259 static const char* description() {
aoqi@0 260 return "Print all threads with stacktraces.";
aoqi@0 261 }
aoqi@0 262 static const char* impact() {
aoqi@0 263 return "Medium: Depends on the number of threads.";
aoqi@0 264 }
aoqi@0 265 static const JavaPermission permission() {
aoqi@0 266 JavaPermission p = {"java.lang.management.ManagementPermission",
aoqi@0 267 "monitor", NULL};
aoqi@0 268 return p;
aoqi@0 269 }
aoqi@0 270 static int num_arguments();
aoqi@0 271 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 272 };
aoqi@0 273
aoqi@0 274 // Enhanced JMX Agent support
aoqi@0 275
aoqi@0 276 class JMXStartRemoteDCmd : public DCmdWithParser {
aoqi@0 277
aoqi@0 278 // Explicitly list all properties that could be
aoqi@0 279 // passed to Agent.startRemoteManagementAgent()
aoqi@0 280 // com.sun.management is omitted
aoqi@0 281
aoqi@0 282 DCmdArgument<char *> _config_file;
sgehwolf@8303 283 DCmdArgument<char *> _jmxremote_host;
aoqi@0 284 DCmdArgument<char *> _jmxremote_port;
aoqi@0 285 DCmdArgument<char *> _jmxremote_rmi_port;
aoqi@0 286 DCmdArgument<char *> _jmxremote_ssl;
aoqi@0 287 DCmdArgument<char *> _jmxremote_registry_ssl;
aoqi@0 288 DCmdArgument<char *> _jmxremote_authenticate;
aoqi@0 289 DCmdArgument<char *> _jmxremote_password_file;
aoqi@0 290 DCmdArgument<char *> _jmxremote_access_file;
aoqi@0 291 DCmdArgument<char *> _jmxremote_login_config;
aoqi@0 292 DCmdArgument<char *> _jmxremote_ssl_enabled_cipher_suites;
aoqi@0 293 DCmdArgument<char *> _jmxremote_ssl_enabled_protocols;
aoqi@0 294 DCmdArgument<char *> _jmxremote_ssl_need_client_auth;
aoqi@0 295 DCmdArgument<char *> _jmxremote_ssl_config_file;
aoqi@0 296
aoqi@0 297 // JDP support
aoqi@0 298 // Keep autodiscovery char* not bool to pass true/false
aoqi@0 299 // as property value to java level.
aoqi@0 300 DCmdArgument<char *> _jmxremote_autodiscovery;
aoqi@0 301 DCmdArgument<jlong> _jdp_port;
aoqi@0 302 DCmdArgument<char *> _jdp_address;
aoqi@0 303 DCmdArgument<char *> _jdp_source_addr;
aoqi@0 304 DCmdArgument<jlong> _jdp_ttl;
aoqi@0 305 DCmdArgument<jlong> _jdp_pause;
aoqi@0 306 DCmdArgument<char *> _jdp_name;
aoqi@0 307
aoqi@0 308 public:
aoqi@0 309 JMXStartRemoteDCmd(outputStream *output, bool heap_allocated);
aoqi@0 310
aoqi@0 311 static const char *name() {
aoqi@0 312 return "ManagementAgent.start";
aoqi@0 313 }
aoqi@0 314
aoqi@0 315 static const char *description() {
aoqi@0 316 return "Start remote management agent.";
aoqi@0 317 }
aoqi@0 318
aoqi@0 319 static int num_arguments();
aoqi@0 320
aoqi@0 321 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 322
aoqi@0 323 };
aoqi@0 324
aoqi@0 325 class JMXStartLocalDCmd : public DCmd {
aoqi@0 326
aoqi@0 327 // Explicitly request start of local agent,
aoqi@0 328 // it will not be started by start dcmd
aoqi@0 329
aoqi@0 330
aoqi@0 331 public:
aoqi@0 332 JMXStartLocalDCmd(outputStream *output, bool heap_allocated);
aoqi@0 333
aoqi@0 334 static const char *name() {
aoqi@0 335 return "ManagementAgent.start_local";
aoqi@0 336 }
aoqi@0 337
aoqi@0 338 static const char *description() {
aoqi@0 339 return "Start local management agent.";
aoqi@0 340 }
aoqi@0 341
aoqi@0 342 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 343
aoqi@0 344 };
aoqi@0 345
aoqi@0 346 class JMXStopRemoteDCmd : public DCmd {
aoqi@0 347 public:
aoqi@0 348 JMXStopRemoteDCmd(outputStream *output, bool heap_allocated) :
aoqi@0 349 DCmd(output, heap_allocated) {
aoqi@0 350 // Do Nothing
aoqi@0 351 }
aoqi@0 352
aoqi@0 353 static const char *name() {
aoqi@0 354 return "ManagementAgent.stop";
aoqi@0 355 }
aoqi@0 356
aoqi@0 357 static const char *description() {
aoqi@0 358 return "Stop remote management agent.";
aoqi@0 359 }
aoqi@0 360
aoqi@0 361 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 362 };
aoqi@0 363
aoqi@0 364 class RotateGCLogDCmd : public DCmd {
aoqi@0 365 public:
aoqi@0 366 RotateGCLogDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}
aoqi@0 367 static const char* name() { return "GC.rotate_log"; }
aoqi@0 368 static const char* description() {
aoqi@0 369 return "Force the GC log file to be rotated.";
aoqi@0 370 }
aoqi@0 371 static const char* impact() { return "Low"; }
aoqi@0 372 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 373 static int num_arguments() { return 0; }
aoqi@0 374 static const JavaPermission permission() {
aoqi@0 375 JavaPermission p = {"java.lang.management.ManagementPermission",
aoqi@0 376 "control", NULL};
aoqi@0 377 return p;
aoqi@0 378 }
aoqi@0 379 };
aoqi@0 380
aoqi@0 381 #endif // SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP

mercurial