fparain@3329: /* acorn@4497: * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. fparain@3329: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. fparain@3329: * fparain@3329: * This code is free software; you can redistribute it and/or modify it fparain@3329: * under the terms of the GNU General Public License version 2 only, as fparain@3329: * published by the Free Software Foundation. fparain@3329: * fparain@3329: * This code is distributed in the hope that it will be useful, but WITHOUT fparain@3329: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or fparain@3329: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License fparain@3329: * version 2 for more details (a copy is included in the LICENSE file that fparain@3329: * accompanied this code). fparain@3329: * fparain@3329: * You should have received a copy of the GNU General Public License version fparain@3329: * 2 along with this work; if not, write to the Free Software Foundation, fparain@3329: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. fparain@3329: * fparain@3329: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA fparain@3329: * or visit www.oracle.com if you need additional information or have any fparain@3329: * questions. fparain@3329: * fparain@3329: */ fparain@3329: fparain@3329: #ifndef SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP fparain@3329: #define SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP fparain@3329: fparain@3329: #include "runtime/arguments.hpp" fparain@3329: #include "classfile/vmSymbols.hpp" fparain@3329: #include "utilities/ostream.hpp" fparain@3329: #include "runtime/vm_version.hpp" fparain@3329: #include "runtime/vmThread.hpp" fparain@3329: #include "runtime/os.hpp" fparain@3329: #include "services/diagnosticArgument.hpp" fparain@3329: #include "services/diagnosticCommand.hpp" fparain@3329: #include "services/diagnosticFramework.hpp" dsamersoff@3478: #include "services/diagnosticCommand_ext.hpp" jprovino@4542: #include "utilities/macros.hpp" fparain@3329: fparain@3402: class HelpDCmd : public DCmdWithParser { fparain@3329: protected: fparain@3329: DCmdArgument _all; fparain@3329: DCmdArgument _cmd; fparain@3329: public: fparain@3329: HelpDCmd(outputStream* output, bool heap); fparain@3329: static const char* name() { return "help"; } fparain@3329: static const char* description() { fparain@3329: return "For more information about a specific command use 'help '. " fparain@3329: "With no argument this will show a list of available commands. " fparain@3329: "'help all' will show help for all commands."; fparain@3329: } sla@3905: static const char* impact() { return "Low"; } fparain@3329: static int num_arguments(); fparain@5047: virtual void execute(DCmdSource source, TRAPS); fparain@3329: }; fparain@3329: fparain@3329: class VersionDCmd : public DCmd { fparain@3329: public: fparain@3329: VersionDCmd(outputStream* output, bool heap) : DCmd(output,heap) { } fparain@3329: static const char* name() { return "VM.version"; } fparain@3329: static const char* description() { fparain@3329: return "Print JVM version information."; fparain@3329: } sla@3905: static const char* impact() { return "Low"; } fparain@5047: static const JavaPermission permission() { fparain@5047: JavaPermission p = {"java.util.PropertyPermission", fparain@5047: "java.vm.version", "read"}; fparain@5047: return p; fparain@5047: } fparain@3329: static int num_arguments() { return 0; } fparain@5047: virtual void execute(DCmdSource source, TRAPS); fparain@3402: }; fparain@3402: fparain@3402: class CommandLineDCmd : public DCmd { fparain@3402: public: fparain@3402: CommandLineDCmd(outputStream* output, bool heap) : DCmd(output, heap) { } fparain@3402: static const char* name() { return "VM.command_line"; } fparain@3402: static const char* description() { fparain@3402: return "Print the command line used to start this VM instance."; fparain@3402: } sla@3905: static const char* impact() { return "Low"; } fparain@5047: static const JavaPermission permission() { fparain@5047: JavaPermission p = {"java.lang.management.ManagementPermission", fparain@5047: "monitor", NULL}; fparain@5047: return p; fparain@5047: } fparain@3402: static int num_arguments() { return 0; } fparain@5047: virtual void execute(DCmdSource source, TRAPS) { fparain@3402: Arguments::print_on(_output); fparain@3402: } fparain@3402: }; fparain@3402: fparain@3402: // See also: get_system_properties in attachListener.cpp fparain@3402: class PrintSystemPropertiesDCmd : public DCmd { fparain@3402: public: fparain@3402: PrintSystemPropertiesDCmd(outputStream* output, bool heap) : DCmd(output, heap) { } fparain@3402: static const char* name() { return "VM.system_properties"; } fparain@3402: static const char* description() { fparain@3402: return "Print system properties."; fparain@3402: } fparain@3402: static const char* impact() { sla@3905: return "Low"; fparain@3402: } fparain@5047: static const JavaPermission permission() { fparain@5047: JavaPermission p = {"java.util.PropertyPermission", fparain@5047: "*", "read"}; fparain@5047: return p; fparain@5047: } fparain@3402: static int num_arguments() { return 0; } fparain@5047: virtual void execute(DCmdSource source, TRAPS); fparain@3402: }; fparain@3402: fparain@3402: // See also: print_flag in attachListener.cpp fparain@3402: class PrintVMFlagsDCmd : public DCmdWithParser { fparain@3402: protected: fparain@3402: DCmdArgument _all; fparain@3402: public: fparain@3402: PrintVMFlagsDCmd(outputStream* output, bool heap); fparain@3402: static const char* name() { return "VM.flags"; } fparain@3402: static const char* description() { fparain@3402: return "Print VM flag options and their current values."; fparain@3402: } fparain@3402: static const char* impact() { sla@3905: return "Low"; fparain@3402: } fparain@5047: static const JavaPermission permission() { fparain@5047: JavaPermission p = {"java.lang.management.ManagementPermission", fparain@5047: "monitor", NULL}; fparain@5047: return p; fparain@5047: } fparain@3402: static int num_arguments(); fparain@5047: virtual void execute(DCmdSource source, TRAPS); fparain@3402: }; fparain@3402: fparain@3402: class VMUptimeDCmd : public DCmdWithParser { fparain@3402: protected: fparain@3402: DCmdArgument _date; fparain@3402: public: fparain@3402: VMUptimeDCmd(outputStream* output, bool heap); fparain@3402: static const char* name() { return "VM.uptime"; } fparain@3402: static const char* description() { fparain@3402: return "Print VM uptime."; fparain@3402: } fparain@3402: static const char* impact() { sla@3905: return "Low"; fparain@3402: } fparain@3402: static int num_arguments(); fparain@5047: virtual void execute(DCmdSource source, TRAPS); fparain@3402: }; fparain@3402: fparain@3402: class SystemGCDCmd : public DCmd { fparain@3402: public: fparain@3402: SystemGCDCmd(outputStream* output, bool heap) : DCmd(output, heap) { } fparain@3402: static const char* name() { return "GC.run"; } fparain@3402: static const char* description() { fparain@3402: return "Call java.lang.System.gc()."; fparain@3402: } fparain@3402: static const char* impact() { fparain@3402: return "Medium: Depends on Java heap size and content."; fparain@3402: } fparain@3402: static int num_arguments() { return 0; } fparain@5047: virtual void execute(DCmdSource source, TRAPS); fparain@3402: }; fparain@3402: fparain@3402: class RunFinalizationDCmd : public DCmd { fparain@3402: public: fparain@3402: RunFinalizationDCmd(outputStream* output, bool heap) : DCmd(output, heap) { } fparain@3402: static const char* name() { return "GC.run_finalization"; } fparain@3402: static const char* description() { fparain@3402: return "Call java.lang.System.runFinalization()."; fparain@3402: } fparain@3402: static const char* impact() { fparain@3402: return "Medium: Depends on Java content."; fparain@3402: } fparain@3402: static int num_arguments() { return 0; } fparain@5047: virtual void execute(DCmdSource source, TRAPS); fparain@3402: }; fparain@3402: jprovino@4165: #if INCLUDE_SERVICES // Heap dumping supported fparain@3402: // See also: dump_heap in attachListener.cpp fparain@3402: class HeapDumpDCmd : public DCmdWithParser { fparain@3402: protected: fparain@3402: DCmdArgument _filename; fparain@3402: DCmdArgument _all; fparain@3402: public: fparain@3402: HeapDumpDCmd(outputStream* output, bool heap); fparain@3402: static const char* name() { fparain@3402: return "GC.heap_dump"; fparain@3402: } fparain@3402: static const char* description() { fparain@3402: return "Generate a HPROF format dump of the Java heap."; fparain@3402: } fparain@3402: static const char* impact() { fparain@3402: return "High: Depends on Java heap size and content. " fparain@3402: "Request a full GC unless the '-all' option is specified."; fparain@3402: } fparain@5047: static const JavaPermission permission() { fparain@5047: JavaPermission p = {"java.lang.management.ManagementPermission", fparain@5047: "monitor", NULL}; fparain@5047: return p; fparain@5047: } fparain@3402: static int num_arguments(); fparain@5047: virtual void execute(DCmdSource source, TRAPS); fparain@3402: }; jprovino@4165: #endif // INCLUDE_SERVICES fparain@3402: acorn@4497: // See also: inspectheap in attachListener.cpp fparain@3402: class ClassHistogramDCmd : public DCmdWithParser { fparain@3402: protected: fparain@3402: DCmdArgument _all; fparain@3402: public: fparain@3402: ClassHistogramDCmd(outputStream* output, bool heap); fparain@3402: static const char* name() { fparain@3402: return "GC.class_histogram"; fparain@3402: } fparain@3402: static const char* description() { fparain@3402: return "Provide statistics about the Java heap usage."; fparain@3402: } fparain@3402: static const char* impact() { fparain@3402: return "High: Depends on Java heap size and content."; fparain@3402: } fparain@5047: static const JavaPermission permission() { fparain@5047: JavaPermission p = {"java.lang.management.ManagementPermission", fparain@5047: "monitor", NULL}; fparain@5047: return p; fparain@5047: } fparain@3402: static int num_arguments(); fparain@5047: virtual void execute(DCmdSource source, TRAPS); fparain@3402: }; fparain@3402: acorn@4497: class ClassStatsDCmd : public DCmdWithParser { acorn@4497: protected: acorn@4497: DCmdArgument _all; acorn@4497: DCmdArgument _csv; acorn@4497: DCmdArgument _help; acorn@4497: DCmdArgument _columns; acorn@4497: public: acorn@4497: ClassStatsDCmd(outputStream* output, bool heap); acorn@4497: static const char* name() { acorn@4497: return "GC.class_stats"; acorn@4497: } acorn@4497: static const char* description() { acorn@4497: return "Provide statistics about Java class meta data. Requires -XX:+UnlockDiagnosticVMOptions."; acorn@4497: } acorn@4497: static const char* impact() { acorn@4497: return "High: Depends on Java heap size and content."; acorn@4497: } acorn@4497: static int num_arguments(); fparain@5047: virtual void execute(DCmdSource source, TRAPS); acorn@4497: }; acorn@4497: fparain@3402: // See also: thread_dump in attachListener.cpp fparain@3402: class ThreadDumpDCmd : public DCmdWithParser { fparain@3402: protected: fparain@3402: DCmdArgument _locks; fparain@3402: public: fparain@3402: ThreadDumpDCmd(outputStream* output, bool heap); fparain@3402: static const char* name() { return "Thread.print"; } fparain@3402: static const char* description() { fparain@3402: return "Print all threads with stacktraces."; fparain@3402: } fparain@3402: static const char* impact() { fparain@3402: return "Medium: Depends on the number of threads."; fparain@3402: } fparain@5047: static const JavaPermission permission() { fparain@5047: JavaPermission p = {"java.lang.management.ManagementPermission", fparain@5047: "monitor", NULL}; fparain@5047: return p; fparain@5047: } fparain@3402: static int num_arguments(); fparain@5047: virtual void execute(DCmdSource source, TRAPS); fparain@3329: }; fparain@3329: dsamersoff@3598: // Enhanced JMX Agent support dsamersoff@3598: dsamersoff@3598: class JMXStartRemoteDCmd : public DCmdWithParser { dsamersoff@3598: dsamersoff@3598: // Explicitly list all properties that could be dsamersoff@3598: // passed to Agent.startRemoteManagementAgent() dsamersoff@3598: // com.sun.management is omitted dsamersoff@3598: dsamersoff@3598: DCmdArgument _config_file; dsamersoff@3598: DCmdArgument _jmxremote_port; dsamersoff@3598: DCmdArgument _jmxremote_rmi_port; dsamersoff@3598: DCmdArgument _jmxremote_ssl; dsamersoff@3598: DCmdArgument _jmxremote_registry_ssl; dsamersoff@3598: DCmdArgument _jmxremote_authenticate; dsamersoff@3598: DCmdArgument _jmxremote_password_file; dsamersoff@3598: DCmdArgument _jmxremote_access_file; dsamersoff@3598: DCmdArgument _jmxremote_login_config; dsamersoff@3598: DCmdArgument _jmxremote_ssl_enabled_cipher_suites; dsamersoff@3598: DCmdArgument _jmxremote_ssl_enabled_protocols; dsamersoff@3598: DCmdArgument _jmxremote_ssl_need_client_auth; dsamersoff@3598: DCmdArgument _jmxremote_ssl_config_file; dsamersoff@3598: dsamersoff@4520: // JDP support dsamersoff@4520: // Keep autodiscovery char* not bool to pass true/false dsamersoff@4520: // as property value to java level. dsamersoff@4520: DCmdArgument _jmxremote_autodiscovery; dsamersoff@4520: DCmdArgument _jdp_port; dsamersoff@4520: DCmdArgument _jdp_address; dsamersoff@4520: DCmdArgument _jdp_source_addr; dsamersoff@4520: DCmdArgument _jdp_ttl; dsamersoff@4520: DCmdArgument _jdp_pause; dsamersoff@4520: dsamersoff@3598: public: dsamersoff@3598: JMXStartRemoteDCmd(outputStream *output, bool heap_allocated); dsamersoff@3598: dsamersoff@3598: static const char *name() { dsamersoff@3598: return "ManagementAgent.start"; dsamersoff@3598: } dsamersoff@3598: dsamersoff@3598: static const char *description() { dsamersoff@3598: return "Start remote management agent."; dsamersoff@3598: } dsamersoff@3598: dsamersoff@3598: static int num_arguments(); dsamersoff@3598: fparain@5047: virtual void execute(DCmdSource source, TRAPS); dsamersoff@3598: dsamersoff@3598: }; dsamersoff@3598: dsamersoff@3598: class JMXStartLocalDCmd : public DCmd { dsamersoff@3598: dsamersoff@3598: // Explicitly request start of local agent, dsamersoff@3598: // it will not be started by start dcmd dsamersoff@3598: dsamersoff@3598: dsamersoff@3598: public: dsamersoff@3598: JMXStartLocalDCmd(outputStream *output, bool heap_allocated); dsamersoff@3598: dsamersoff@3598: static const char *name() { dsamersoff@3598: return "ManagementAgent.start_local"; dsamersoff@3598: } dsamersoff@3598: dsamersoff@3598: static const char *description() { dsamersoff@3598: return "Start local management agent."; dsamersoff@3598: } dsamersoff@3598: fparain@5047: virtual void execute(DCmdSource source, TRAPS); dsamersoff@3598: dsamersoff@3598: }; dsamersoff@3598: dsamersoff@3598: class JMXStopRemoteDCmd : public DCmd { dsamersoff@3598: public: dsamersoff@3598: JMXStopRemoteDCmd(outputStream *output, bool heap_allocated) : dsamersoff@3598: DCmd(output, heap_allocated) { dsamersoff@3598: // Do Nothing dsamersoff@3598: } dsamersoff@3598: dsamersoff@3598: static const char *name() { dsamersoff@3598: return "ManagementAgent.stop"; dsamersoff@3598: } dsamersoff@3598: dsamersoff@3598: static const char *description() { dsamersoff@3598: return "Stop remote management agent."; dsamersoff@3598: } dsamersoff@3598: fparain@5047: virtual void execute(DCmdSource source, TRAPS); dsamersoff@3598: }; dsamersoff@3598: fparain@3329: #endif // SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP