src/share/vm/services/diagnosticCommand.hpp

Wed, 03 Jul 2019 20:42:37 +0800

author
aoqi
date
Wed, 03 Jul 2019 20:42:37 +0800
changeset 9637
eef07cd490d4
parent 9122
024be04bb151
permissions
-rw-r--r--

Merge

aoqi@0 1 /*
dbuck@9059 2 * Copyright (c) 2011, 2017, 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
dbuck@9061 135 class VMDynamicLibrariesDCmd : public DCmd {
dbuck@9061 136 public:
dbuck@9061 137 VMDynamicLibrariesDCmd(outputStream* output, bool heap);
dbuck@9061 138 static const char* name() {
dbuck@9061 139 return "VM.dynlibs";
dbuck@9061 140 }
dbuck@9061 141 static const char* description() {
dbuck@9061 142 return "Print loaded dynamic libraries.";
dbuck@9061 143 }
dbuck@9061 144 static const char* impact() {
dbuck@9061 145 return "Low";
dbuck@9061 146 }
dbuck@9061 147 static const JavaPermission permission() {
dbuck@9061 148 JavaPermission p = {"java.lang.management.ManagementPermission",
dbuck@9061 149 "monitor", NULL};
dbuck@9061 150 return p;
dbuck@9061 151 }
dbuck@9061 152 static int num_arguments() {
dbuck@9061 153 return 0;
dbuck@9061 154 };
dbuck@9061 155 virtual void execute(DCmdSource source, TRAPS);
dbuck@9061 156 };
dbuck@9061 157
aoqi@0 158 class VMUptimeDCmd : public DCmdWithParser {
aoqi@0 159 protected:
aoqi@0 160 DCmdArgument<bool> _date;
aoqi@0 161 public:
aoqi@0 162 VMUptimeDCmd(outputStream* output, bool heap);
aoqi@0 163 static const char* name() { return "VM.uptime"; }
aoqi@0 164 static const char* description() {
aoqi@0 165 return "Print VM uptime.";
aoqi@0 166 }
aoqi@0 167 static const char* impact() {
aoqi@0 168 return "Low";
aoqi@0 169 }
aoqi@0 170 static int num_arguments();
aoqi@0 171 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 172 };
aoqi@0 173
aoqi@0 174 class SystemGCDCmd : public DCmd {
aoqi@0 175 public:
aoqi@0 176 SystemGCDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
aoqi@0 177 static const char* name() { return "GC.run"; }
aoqi@0 178 static const char* description() {
aoqi@0 179 return "Call java.lang.System.gc().";
aoqi@0 180 }
aoqi@0 181 static const char* impact() {
aoqi@0 182 return "Medium: Depends on Java heap size and content.";
aoqi@0 183 }
aoqi@0 184 static int num_arguments() { return 0; }
aoqi@0 185 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 186 };
aoqi@0 187
aoqi@0 188 class RunFinalizationDCmd : public DCmd {
aoqi@0 189 public:
aoqi@0 190 RunFinalizationDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
aoqi@0 191 static const char* name() { return "GC.run_finalization"; }
aoqi@0 192 static const char* description() {
aoqi@0 193 return "Call java.lang.System.runFinalization().";
aoqi@0 194 }
aoqi@0 195 static const char* impact() {
aoqi@0 196 return "Medium: Depends on Java content.";
aoqi@0 197 }
aoqi@0 198 static int num_arguments() { return 0; }
aoqi@0 199 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 200 };
aoqi@0 201
dbuck@9059 202 class HeapInfoDCmd : public DCmd {
dbuck@9059 203 public:
dbuck@9059 204 HeapInfoDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
dbuck@9059 205 static const char* name() { return "GC.heap_info"; }
dbuck@9059 206 static const char* description() {
dbuck@9059 207 return "Provide generic Java heap information.";
dbuck@9059 208 }
dbuck@9059 209 static const char* impact() {
dbuck@9059 210 return "Medium";
dbuck@9059 211 }
dbuck@9059 212 static int num_arguments() { return 0; }
dbuck@9059 213 static const JavaPermission permission() {
dbuck@9059 214 JavaPermission p = {"java.lang.management.ManagementPermission",
dbuck@9059 215 "monitor", NULL};
dbuck@9059 216 return p;
dbuck@9059 217 }
dbuck@9059 218
dbuck@9059 219 virtual void execute(DCmdSource source, TRAPS);
dbuck@9059 220 };
dbuck@9059 221
dbuck@9059 222 class FinalizerInfoDCmd : public DCmd {
dbuck@9059 223 public:
dbuck@9059 224 FinalizerInfoDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
dbuck@9059 225 static const char* name() { return "GC.finalizer_info"; }
dbuck@9059 226 static const char* description() {
dbuck@9059 227 return "Provide information about Java finalization queue.";
dbuck@9059 228 }
dbuck@9059 229 static const char* impact() {
dbuck@9059 230 return "Medium";
dbuck@9059 231 }
dbuck@9059 232 static int num_arguments() { return 0; }
dbuck@9059 233 static const JavaPermission permission() {
dbuck@9059 234 JavaPermission p = {"java.lang.management.ManagementPermission",
dbuck@9059 235 "monitor", NULL};
dbuck@9059 236 return p;
dbuck@9059 237 }
dbuck@9059 238
dbuck@9059 239 virtual void execute(DCmdSource source, TRAPS);
dbuck@9059 240 };
dbuck@9059 241
aoqi@0 242 #if INCLUDE_SERVICES // Heap dumping supported
aoqi@0 243 // See also: dump_heap in attachListener.cpp
aoqi@0 244 class HeapDumpDCmd : public DCmdWithParser {
aoqi@0 245 protected:
aoqi@0 246 DCmdArgument<char*> _filename;
aoqi@0 247 DCmdArgument<bool> _all;
aoqi@0 248 public:
aoqi@0 249 HeapDumpDCmd(outputStream* output, bool heap);
aoqi@0 250 static const char* name() {
aoqi@0 251 return "GC.heap_dump";
aoqi@0 252 }
aoqi@0 253 static const char* description() {
aoqi@0 254 return "Generate a HPROF format dump of the Java heap.";
aoqi@0 255 }
aoqi@0 256 static const char* impact() {
aoqi@0 257 return "High: Depends on Java heap size and content. "
aoqi@0 258 "Request a full GC unless the '-all' option is specified.";
aoqi@0 259 }
aoqi@0 260 static const JavaPermission permission() {
aoqi@0 261 JavaPermission p = {"java.lang.management.ManagementPermission",
aoqi@0 262 "monitor", NULL};
aoqi@0 263 return p;
aoqi@0 264 }
aoqi@0 265 static int num_arguments();
aoqi@0 266 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 267 };
aoqi@0 268 #endif // INCLUDE_SERVICES
aoqi@0 269
aoqi@0 270 // See also: inspectheap in attachListener.cpp
aoqi@0 271 class ClassHistogramDCmd : public DCmdWithParser {
aoqi@0 272 protected:
aoqi@0 273 DCmdArgument<bool> _all;
aoqi@0 274 public:
aoqi@0 275 ClassHistogramDCmd(outputStream* output, bool heap);
aoqi@0 276 static const char* name() {
aoqi@0 277 return "GC.class_histogram";
aoqi@0 278 }
aoqi@0 279 static const char* description() {
aoqi@0 280 return "Provide statistics about the Java heap usage.";
aoqi@0 281 }
aoqi@0 282 static const char* impact() {
aoqi@0 283 return "High: Depends on Java heap size and content.";
aoqi@0 284 }
aoqi@0 285 static const JavaPermission permission() {
aoqi@0 286 JavaPermission p = {"java.lang.management.ManagementPermission",
aoqi@0 287 "monitor", NULL};
aoqi@0 288 return p;
aoqi@0 289 }
aoqi@0 290 static int num_arguments();
aoqi@0 291 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 292 };
aoqi@0 293
aoqi@0 294 class ClassStatsDCmd : public DCmdWithParser {
aoqi@0 295 protected:
aoqi@0 296 DCmdArgument<bool> _all;
aoqi@0 297 DCmdArgument<bool> _csv;
aoqi@0 298 DCmdArgument<bool> _help;
aoqi@0 299 DCmdArgument<char*> _columns;
aoqi@0 300 public:
aoqi@0 301 ClassStatsDCmd(outputStream* output, bool heap);
aoqi@0 302 static const char* name() {
aoqi@0 303 return "GC.class_stats";
aoqi@0 304 }
aoqi@0 305 static const char* description() {
aoqi@0 306 return "Provide statistics about Java class meta data. Requires -XX:+UnlockDiagnosticVMOptions.";
aoqi@0 307 }
aoqi@0 308 static const char* impact() {
aoqi@0 309 return "High: Depends on Java heap size and content.";
aoqi@0 310 }
aoqi@0 311 static int num_arguments();
aoqi@0 312 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 313 };
aoqi@0 314
aoqi@0 315 // See also: thread_dump in attachListener.cpp
aoqi@0 316 class ThreadDumpDCmd : public DCmdWithParser {
aoqi@0 317 protected:
aoqi@0 318 DCmdArgument<bool> _locks;
aoqi@0 319 public:
aoqi@0 320 ThreadDumpDCmd(outputStream* output, bool heap);
aoqi@0 321 static const char* name() { return "Thread.print"; }
aoqi@0 322 static const char* description() {
aoqi@0 323 return "Print all threads with stacktraces.";
aoqi@0 324 }
aoqi@0 325 static const char* impact() {
aoqi@0 326 return "Medium: Depends on the number of threads.";
aoqi@0 327 }
aoqi@0 328 static const JavaPermission permission() {
aoqi@0 329 JavaPermission p = {"java.lang.management.ManagementPermission",
aoqi@0 330 "monitor", NULL};
aoqi@0 331 return p;
aoqi@0 332 }
aoqi@0 333 static int num_arguments();
aoqi@0 334 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 335 };
aoqi@0 336
aoqi@0 337 // Enhanced JMX Agent support
aoqi@0 338
aoqi@0 339 class JMXStartRemoteDCmd : public DCmdWithParser {
aoqi@0 340
aoqi@0 341 // Explicitly list all properties that could be
aoqi@0 342 // passed to Agent.startRemoteManagementAgent()
aoqi@0 343 // com.sun.management is omitted
aoqi@0 344
aoqi@0 345 DCmdArgument<char *> _config_file;
sgehwolf@8303 346 DCmdArgument<char *> _jmxremote_host;
aoqi@0 347 DCmdArgument<char *> _jmxremote_port;
aoqi@0 348 DCmdArgument<char *> _jmxremote_rmi_port;
aoqi@0 349 DCmdArgument<char *> _jmxremote_ssl;
aoqi@0 350 DCmdArgument<char *> _jmxremote_registry_ssl;
aoqi@0 351 DCmdArgument<char *> _jmxremote_authenticate;
aoqi@0 352 DCmdArgument<char *> _jmxremote_password_file;
aoqi@0 353 DCmdArgument<char *> _jmxremote_access_file;
aoqi@0 354 DCmdArgument<char *> _jmxremote_login_config;
aoqi@0 355 DCmdArgument<char *> _jmxremote_ssl_enabled_cipher_suites;
aoqi@0 356 DCmdArgument<char *> _jmxremote_ssl_enabled_protocols;
aoqi@0 357 DCmdArgument<char *> _jmxremote_ssl_need_client_auth;
aoqi@0 358 DCmdArgument<char *> _jmxremote_ssl_config_file;
aoqi@0 359
aoqi@0 360 // JDP support
aoqi@0 361 // Keep autodiscovery char* not bool to pass true/false
aoqi@0 362 // as property value to java level.
aoqi@0 363 DCmdArgument<char *> _jmxremote_autodiscovery;
aoqi@0 364 DCmdArgument<jlong> _jdp_port;
aoqi@0 365 DCmdArgument<char *> _jdp_address;
aoqi@0 366 DCmdArgument<char *> _jdp_source_addr;
aoqi@0 367 DCmdArgument<jlong> _jdp_ttl;
aoqi@0 368 DCmdArgument<jlong> _jdp_pause;
aoqi@0 369 DCmdArgument<char *> _jdp_name;
aoqi@0 370
aoqi@0 371 public:
aoqi@0 372 JMXStartRemoteDCmd(outputStream *output, bool heap_allocated);
aoqi@0 373
aoqi@0 374 static const char *name() {
aoqi@0 375 return "ManagementAgent.start";
aoqi@0 376 }
aoqi@0 377
aoqi@0 378 static const char *description() {
aoqi@0 379 return "Start remote management agent.";
aoqi@0 380 }
aoqi@0 381
aoqi@0 382 static int num_arguments();
aoqi@0 383
aoqi@0 384 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 385
aoqi@0 386 };
aoqi@0 387
aoqi@0 388 class JMXStartLocalDCmd : public DCmd {
aoqi@0 389
aoqi@0 390 // Explicitly request start of local agent,
aoqi@0 391 // it will not be started by start dcmd
aoqi@0 392
aoqi@0 393
aoqi@0 394 public:
aoqi@0 395 JMXStartLocalDCmd(outputStream *output, bool heap_allocated);
aoqi@0 396
aoqi@0 397 static const char *name() {
aoqi@0 398 return "ManagementAgent.start_local";
aoqi@0 399 }
aoqi@0 400
aoqi@0 401 static const char *description() {
aoqi@0 402 return "Start local management agent.";
aoqi@0 403 }
aoqi@0 404
aoqi@0 405 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 406
aoqi@0 407 };
aoqi@0 408
aoqi@0 409 class JMXStopRemoteDCmd : public DCmd {
aoqi@0 410 public:
aoqi@0 411 JMXStopRemoteDCmd(outputStream *output, bool heap_allocated) :
aoqi@0 412 DCmd(output, heap_allocated) {
aoqi@0 413 // Do Nothing
aoqi@0 414 }
aoqi@0 415
aoqi@0 416 static const char *name() {
aoqi@0 417 return "ManagementAgent.stop";
aoqi@0 418 }
aoqi@0 419
aoqi@0 420 static const char *description() {
aoqi@0 421 return "Stop remote management agent.";
aoqi@0 422 }
aoqi@0 423
aoqi@0 424 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 425 };
aoqi@0 426
aoqi@0 427 class RotateGCLogDCmd : public DCmd {
aoqi@0 428 public:
aoqi@0 429 RotateGCLogDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}
aoqi@0 430 static const char* name() { return "GC.rotate_log"; }
aoqi@0 431 static const char* description() {
aoqi@0 432 return "Force the GC log file to be rotated.";
aoqi@0 433 }
aoqi@0 434 static const char* impact() { return "Low"; }
aoqi@0 435 virtual void execute(DCmdSource source, TRAPS);
aoqi@0 436 static int num_arguments() { return 0; }
aoqi@0 437 static const JavaPermission permission() {
aoqi@0 438 JavaPermission p = {"java.lang.management.ManagementPermission",
aoqi@0 439 "control", NULL};
aoqi@0 440 return p;
aoqi@0 441 }
aoqi@0 442 };
aoqi@0 443
aoqi@0 444 #endif // SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP

mercurial