Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/share/vm/services/diagnosticCommand.hpp
32285 views
/*1* Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*22*/2324#ifndef SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP25#define SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP2627#include "runtime/arguments.hpp"28#include "classfile/vmSymbols.hpp"29#include "utilities/ostream.hpp"30#include "runtime/vm_version.hpp"31#include "runtime/vmThread.hpp"32#include "runtime/os.hpp"33#include "services/diagnosticArgument.hpp"34#include "services/diagnosticCommand.hpp"35#include "services/diagnosticFramework.hpp"36#include "services/diagnosticCommand_ext.hpp"37#include "utilities/macros.hpp"3839class HelpDCmd : public DCmdWithParser {40protected:41DCmdArgument<bool> _all;42DCmdArgument<char*> _cmd;43public:44HelpDCmd(outputStream* output, bool heap);45static const char* name() { return "help"; }46static const char* description() {47return "For more information about a specific command use 'help <command>'. "48"With no argument this will show a list of available commands. "49"'help all' will show help for all commands.";50}51static const char* impact() { return "Low"; }52static int num_arguments();53virtual void execute(DCmdSource source, TRAPS);54};5556class VersionDCmd : public DCmd {57public:58VersionDCmd(outputStream* output, bool heap) : DCmd(output,heap) { }59static const char* name() { return "VM.version"; }60static const char* description() {61return "Print JVM version information.";62}63static const char* impact() { return "Low"; }64static const JavaPermission permission() {65JavaPermission p = {"java.util.PropertyPermission",66"java.vm.version", "read"};67return p;68}69static int num_arguments() { return 0; }70virtual void execute(DCmdSource source, TRAPS);71};7273class CommandLineDCmd : public DCmd {74public:75CommandLineDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }76static const char* name() { return "VM.command_line"; }77static const char* description() {78return "Print the command line used to start this VM instance.";79}80static const char* impact() { return "Low"; }81static const JavaPermission permission() {82JavaPermission p = {"java.lang.management.ManagementPermission",83"monitor", NULL};84return p;85}86static int num_arguments() { return 0; }87virtual void execute(DCmdSource source, TRAPS) {88Arguments::print_on(_output);89}90};9192// See also: get_system_properties in attachListener.cpp93class PrintSystemPropertiesDCmd : public DCmd {94public:95PrintSystemPropertiesDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }96static const char* name() { return "VM.system_properties"; }97static const char* description() {98return "Print system properties.";99}100static const char* impact() {101return "Low";102}103static const JavaPermission permission() {104JavaPermission p = {"java.util.PropertyPermission",105"*", "read"};106return p;107}108static int num_arguments() { return 0; }109virtual void execute(DCmdSource source, TRAPS);110};111112// See also: print_flag in attachListener.cpp113class PrintVMFlagsDCmd : public DCmdWithParser {114protected:115DCmdArgument<bool> _all;116public:117PrintVMFlagsDCmd(outputStream* output, bool heap);118static const char* name() { return "VM.flags"; }119static const char* description() {120return "Print VM flag options and their current values.";121}122static const char* impact() {123return "Low";124}125static const JavaPermission permission() {126JavaPermission p = {"java.lang.management.ManagementPermission",127"monitor", NULL};128return p;129}130static int num_arguments();131virtual void execute(DCmdSource source, TRAPS);132};133134class VMDynamicLibrariesDCmd : public DCmd {135public:136VMDynamicLibrariesDCmd(outputStream* output, bool heap);137static const char* name() {138return "VM.dynlibs";139}140static const char* description() {141return "Print loaded dynamic libraries.";142}143static const char* impact() {144return "Low";145}146static const JavaPermission permission() {147JavaPermission p = {"java.lang.management.ManagementPermission",148"monitor", NULL};149return p;150}151static int num_arguments() {152return 0;153};154virtual void execute(DCmdSource source, TRAPS);155};156157class VMUptimeDCmd : public DCmdWithParser {158protected:159DCmdArgument<bool> _date;160public:161VMUptimeDCmd(outputStream* output, bool heap);162static const char* name() { return "VM.uptime"; }163static const char* description() {164return "Print VM uptime.";165}166static const char* impact() {167return "Low";168}169static int num_arguments();170virtual void execute(DCmdSource source, TRAPS);171};172173class SystemGCDCmd : public DCmd {174public:175SystemGCDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }176static const char* name() { return "GC.run"; }177static const char* description() {178return "Call java.lang.System.gc().";179}180static const char* impact() {181return "Medium: Depends on Java heap size and content.";182}183static int num_arguments() { return 0; }184virtual void execute(DCmdSource source, TRAPS);185};186187class RunFinalizationDCmd : public DCmd {188public:189RunFinalizationDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }190static const char* name() { return "GC.run_finalization"; }191static const char* description() {192return "Call java.lang.System.runFinalization().";193}194static const char* impact() {195return "Medium: Depends on Java content.";196}197static int num_arguments() { return 0; }198virtual void execute(DCmdSource source, TRAPS);199};200201class HeapInfoDCmd : public DCmd {202public:203HeapInfoDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }204static const char* name() { return "GC.heap_info"; }205static const char* description() {206return "Provide generic Java heap information.";207}208static const char* impact() {209return "Medium";210}211static int num_arguments() { return 0; }212static const JavaPermission permission() {213JavaPermission p = {"java.lang.management.ManagementPermission",214"monitor", NULL};215return p;216}217218virtual void execute(DCmdSource source, TRAPS);219};220221class FinalizerInfoDCmd : public DCmd {222public:223FinalizerInfoDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }224static const char* name() { return "GC.finalizer_info"; }225static const char* description() {226return "Provide information about Java finalization queue.";227}228static const char* impact() {229return "Medium";230}231static int num_arguments() { return 0; }232static const JavaPermission permission() {233JavaPermission p = {"java.lang.management.ManagementPermission",234"monitor", NULL};235return p;236}237238virtual void execute(DCmdSource source, TRAPS);239};240241#if INCLUDE_SERVICES // Heap dumping supported242// See also: dump_heap in attachListener.cpp243class HeapDumpDCmd : public DCmdWithParser {244protected:245DCmdArgument<char*> _filename;246DCmdArgument<bool> _all;247public:248HeapDumpDCmd(outputStream* output, bool heap);249static const char* name() {250return "GC.heap_dump";251}252static const char* description() {253return "Generate a HPROF format dump of the Java heap.";254}255static const char* impact() {256return "High: Depends on Java heap size and content. "257"Request a full GC unless the '-all' option is specified.";258}259static const JavaPermission permission() {260JavaPermission p = {"java.lang.management.ManagementPermission",261"monitor", NULL};262return p;263}264static int num_arguments();265virtual void execute(DCmdSource source, TRAPS);266};267#endif // INCLUDE_SERVICES268269// See also: inspectheap in attachListener.cpp270class ClassHistogramDCmd : public DCmdWithParser {271protected:272DCmdArgument<bool> _all;273public:274ClassHistogramDCmd(outputStream* output, bool heap);275static const char* name() {276return "GC.class_histogram";277}278static const char* description() {279return "Provide statistics about the Java heap usage.";280}281static const char* impact() {282return "High: Depends on Java heap size and content.";283}284static const JavaPermission permission() {285JavaPermission p = {"java.lang.management.ManagementPermission",286"monitor", NULL};287return p;288}289static int num_arguments();290virtual void execute(DCmdSource source, TRAPS);291};292293class ClassStatsDCmd : public DCmdWithParser {294protected:295DCmdArgument<bool> _all;296DCmdArgument<bool> _csv;297DCmdArgument<bool> _help;298DCmdArgument<char*> _columns;299public:300ClassStatsDCmd(outputStream* output, bool heap);301static const char* name() {302return "GC.class_stats";303}304static const char* description() {305return "Provide statistics about Java class meta data. Requires -XX:+UnlockDiagnosticVMOptions.";306}307static const char* impact() {308return "High: Depends on Java heap size and content.";309}310static int num_arguments();311virtual void execute(DCmdSource source, TRAPS);312};313314// See also: thread_dump in attachListener.cpp315class ThreadDumpDCmd : public DCmdWithParser {316protected:317DCmdArgument<bool> _locks;318public:319ThreadDumpDCmd(outputStream* output, bool heap);320static const char* name() { return "Thread.print"; }321static const char* description() {322return "Print all threads with stacktraces.";323}324static const char* impact() {325return "Medium: Depends on the number of threads.";326}327static const JavaPermission permission() {328JavaPermission p = {"java.lang.management.ManagementPermission",329"monitor", NULL};330return p;331}332static int num_arguments();333virtual void execute(DCmdSource source, TRAPS);334};335336// Enhanced JMX Agent support337338class JMXStartRemoteDCmd : public DCmdWithParser {339340// Explicitly list all properties that could be341// passed to Agent.startRemoteManagementAgent()342// com.sun.management is omitted343344DCmdArgument<char *> _config_file;345DCmdArgument<char *> _jmxremote_host;346DCmdArgument<char *> _jmxremote_port;347DCmdArgument<char *> _jmxremote_rmi_port;348DCmdArgument<char *> _jmxremote_ssl;349DCmdArgument<char *> _jmxremote_registry_ssl;350DCmdArgument<char *> _jmxremote_authenticate;351DCmdArgument<char *> _jmxremote_password_file;352DCmdArgument<char *> _jmxremote_access_file;353DCmdArgument<char *> _jmxremote_login_config;354DCmdArgument<char *> _jmxremote_ssl_enabled_cipher_suites;355DCmdArgument<char *> _jmxremote_ssl_enabled_protocols;356DCmdArgument<char *> _jmxremote_ssl_need_client_auth;357DCmdArgument<char *> _jmxremote_ssl_config_file;358359// JDP support360// Keep autodiscovery char* not bool to pass true/false361// as property value to java level.362DCmdArgument<char *> _jmxremote_autodiscovery;363DCmdArgument<jlong> _jdp_port;364DCmdArgument<char *> _jdp_address;365DCmdArgument<char *> _jdp_source_addr;366DCmdArgument<jlong> _jdp_ttl;367DCmdArgument<jlong> _jdp_pause;368DCmdArgument<char *> _jdp_name;369370public:371JMXStartRemoteDCmd(outputStream *output, bool heap_allocated);372373static const char *name() {374return "ManagementAgent.start";375}376377static const char *description() {378return "Start remote management agent.";379}380381static int num_arguments();382383virtual void execute(DCmdSource source, TRAPS);384385};386387class JMXStartLocalDCmd : public DCmd {388389// Explicitly request start of local agent,390// it will not be started by start dcmd391392393public:394JMXStartLocalDCmd(outputStream *output, bool heap_allocated);395396static const char *name() {397return "ManagementAgent.start_local";398}399400static const char *description() {401return "Start local management agent.";402}403404virtual void execute(DCmdSource source, TRAPS);405406};407408class JMXStopRemoteDCmd : public DCmd {409public:410JMXStopRemoteDCmd(outputStream *output, bool heap_allocated) :411DCmd(output, heap_allocated) {412// Do Nothing413}414415static const char *name() {416return "ManagementAgent.stop";417}418419static const char *description() {420return "Stop remote management agent.";421}422423virtual void execute(DCmdSource source, TRAPS);424};425426class RotateGCLogDCmd : public DCmd {427public:428RotateGCLogDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}429static const char* name() { return "GC.rotate_log"; }430static const char* description() {431return "Force the GC log file to be rotated.";432}433static const char* impact() { return "Low"; }434virtual void execute(DCmdSource source, TRAPS);435static int num_arguments() { return 0; }436static const JavaPermission permission() {437JavaPermission p = {"java.lang.management.ManagementPermission",438"control", NULL};439return p;440}441};442443#endif // SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP444445446