Path: blob/master/src/hotspot/share/services/diagnosticCommand.hpp
41144 views
/*1* Copyright (c) 2011, 2021, 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_SERVICES_DIAGNOSTICCOMMAND_HPP25#define SHARE_SERVICES_DIAGNOSTICCOMMAND_HPP2627#include "classfile/stringTable.hpp"28#include "classfile/symbolTable.hpp"29#include "classfile/systemDictionary.hpp"30#include "classfile/vmSymbols.hpp"31#include "runtime/arguments.hpp"32#include "runtime/os.hpp"33#include "runtime/vmThread.hpp"34#include "services/diagnosticArgument.hpp"35#include "services/diagnosticCommand.hpp"36#include "services/diagnosticFramework.hpp"37#include "utilities/macros.hpp"38#include "utilities/ostream.hpp"39#include "oops/method.hpp"4041class HelpDCmd : public DCmdWithParser {42protected:43DCmdArgument<bool> _all;44DCmdArgument<char*> _cmd;45public:46HelpDCmd(outputStream* output, bool heap);47static const char* name() { return "help"; }48static const char* description() {49return "For more information about a specific command use 'help <command>'. "50"With no argument this will show a list of available commands. "51"'help all' will show help for all commands.";52}53static const char* impact() { return "Low"; }54virtual void execute(DCmdSource source, TRAPS);55};5657class VersionDCmd : public DCmd {58public:59VersionDCmd(outputStream* output, bool heap) : DCmd(output,heap) { }60static const char* name() { return "VM.version"; }61static const char* description() {62return "Print JVM version information.";63}64static const char* impact() { return "Low"; }65static const JavaPermission permission() {66JavaPermission p = {"java.util.PropertyPermission",67"java.vm.version", "read"};68return p;69}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}86virtual void execute(DCmdSource source, TRAPS) {87Arguments::print_on(_output);88}89};9091// See also: get_system_properties in attachListener.cpp92class PrintSystemPropertiesDCmd : public DCmd {93public:94PrintSystemPropertiesDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }95static const char* name() { return "VM.system_properties"; }96static const char* description() {97return "Print system properties.";98}99static const char* impact() {100return "Low";101}102static const JavaPermission permission() {103JavaPermission p = {"java.util.PropertyPermission",104"*", "read"};105return p;106}107virtual void execute(DCmdSource source, TRAPS);108};109110// See also: print_flag in attachListener.cpp111class PrintVMFlagsDCmd : public DCmdWithParser {112protected:113DCmdArgument<bool> _all;114public:115PrintVMFlagsDCmd(outputStream* output, bool heap);116static const char* name() { return "VM.flags"; }117static const char* description() {118return "Print VM flag options and their current values.";119}120static const char* impact() {121return "Low";122}123static const JavaPermission permission() {124JavaPermission p = {"java.lang.management.ManagementPermission",125"monitor", NULL};126return p;127}128virtual void execute(DCmdSource source, TRAPS);129};130131class SetVMFlagDCmd : public DCmdWithParser {132protected:133DCmdArgument<char*> _flag;134DCmdArgument<char*> _value;135136public:137SetVMFlagDCmd(outputStream* output, bool heap);138static const char* name() { return "VM.set_flag"; }139static const char* description() {140return "Sets VM flag option using the provided value.";141}142static const char* impact() {143return "Low";144}145static const JavaPermission permission() {146JavaPermission p = {"java.lang.management.ManagementPermission",147"control", NULL};148return p;149}150virtual void execute(DCmdSource source, TRAPS);151};152153class JVMTIDataDumpDCmd : public DCmd {154public:155JVMTIDataDumpDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }156static const char* name() { return "JVMTI.data_dump"; }157static const char* description() {158return "Signal the JVM to do a data-dump request for JVMTI.";159}160static const char* impact() {161return "High";162}163static const JavaPermission permission() {164JavaPermission p = {"java.lang.management.ManagementPermission",165"monitor", NULL};166return p;167}168virtual void execute(DCmdSource source, TRAPS);169};170171#if INCLUDE_SERVICES172#if INCLUDE_JVMTI173class JVMTIAgentLoadDCmd : public DCmdWithParser {174protected:175DCmdArgument<char*> _libpath;176DCmdArgument<char*> _option;177public:178JVMTIAgentLoadDCmd(outputStream* output, bool heap);179static const char* name() { return "JVMTI.agent_load"; }180static const char* description() {181return "Load JVMTI native agent.";182}183static const char* impact() { return "Low"; }184static const JavaPermission permission() {185JavaPermission p = {"java.lang.management.ManagementPermission",186"control", NULL};187return p;188}189virtual void execute(DCmdSource source, TRAPS);190};191#endif // INCLUDE_JVMTI192#endif // INCLUDE_SERVICES193194class VMDynamicLibrariesDCmd : public DCmd {195public:196VMDynamicLibrariesDCmd(outputStream* output, bool heap);197static const char* name() {198return "VM.dynlibs";199}200static const char* description() {201return "Print loaded dynamic libraries.";202}203static const char* impact() {204return "Low";205}206static const JavaPermission permission() {207JavaPermission p = {"java.lang.management.ManagementPermission",208"monitor", NULL};209return p;210}211virtual void execute(DCmdSource source, TRAPS);212};213214class VMUptimeDCmd : public DCmdWithParser {215protected:216DCmdArgument<bool> _date;217public:218VMUptimeDCmd(outputStream* output, bool heap);219static const char* name() { return "VM.uptime"; }220static const char* description() {221return "Print VM uptime.";222}223static const char* impact() {224return "Low";225}226virtual void execute(DCmdSource source, TRAPS);227};228229class VMInfoDCmd : public DCmd {230public:231VMInfoDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }232static const char* name() { return "VM.info"; }233static const char* description() {234return "Print information about JVM environment and status.";235}236static const char* impact() { return "Low"; }237static const JavaPermission permission() {238JavaPermission p = {"java.lang.management.ManagementPermission",239"monitor", NULL};240return p;241}242virtual void execute(DCmdSource source, TRAPS);243};244245class SystemGCDCmd : public DCmd {246public:247SystemGCDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }248static const char* name() { return "GC.run"; }249static const char* description() {250return "Call java.lang.System.gc().";251}252static const char* impact() {253return "Medium: Depends on Java heap size and content.";254}255virtual void execute(DCmdSource source, TRAPS);256};257258class RunFinalizationDCmd : public DCmd {259public:260RunFinalizationDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }261static const char* name() { return "GC.run_finalization"; }262static const char* description() {263return "Call java.lang.System.runFinalization().";264}265static const char* impact() {266return "Medium: Depends on Java content.";267}268virtual void execute(DCmdSource source, TRAPS);269};270271class HeapInfoDCmd : public DCmd {272public:273HeapInfoDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }274static const char* name() { return "GC.heap_info"; }275static const char* description() {276return "Provide generic Java heap information.";277}278static const char* impact() {279return "Medium";280}281static const JavaPermission permission() {282JavaPermission p = {"java.lang.management.ManagementPermission",283"monitor", NULL};284return p;285}286287virtual void execute(DCmdSource source, TRAPS);288};289290class FinalizerInfoDCmd : public DCmd {291public:292FinalizerInfoDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }293static const char* name() { return "GC.finalizer_info"; }294static const char* description() {295return "Provide information about Java finalization queue.";296}297static const char* impact() {298return "Medium";299}300static const JavaPermission permission() {301JavaPermission p = {"java.lang.management.ManagementPermission",302"monitor", NULL};303return p;304}305306virtual void execute(DCmdSource source, TRAPS);307};308309#if INCLUDE_SERVICES // Heap dumping supported310// See also: dump_heap in attachListener.cpp311class HeapDumpDCmd : public DCmdWithParser {312protected:313DCmdArgument<char*> _filename;314DCmdArgument<bool> _all;315DCmdArgument<jlong> _gzip;316public:317HeapDumpDCmd(outputStream* output, bool heap);318static const char* name() {319return "GC.heap_dump";320}321static const char* description() {322return "Generate a HPROF format dump of the Java heap.";323}324static const char* impact() {325return "High: Depends on Java heap size and content. "326"Request a full GC unless the '-all' option is specified.";327}328static const JavaPermission permission() {329JavaPermission p = {"java.lang.management.ManagementPermission",330"monitor", NULL};331return p;332}333virtual void execute(DCmdSource source, TRAPS);334};335#endif // INCLUDE_SERVICES336337// See also: inspectheap in attachListener.cpp338class ClassHistogramDCmd : public DCmdWithParser {339protected:340DCmdArgument<bool> _all;341DCmdArgument<jlong> _parallel_thread_num;342public:343ClassHistogramDCmd(outputStream* output, bool heap);344static const char* name() {345return "GC.class_histogram";346}347static const char* description() {348return "Provide statistics about the Java heap usage.";349}350static const char* impact() {351return "High: Depends on Java heap size and content.";352}353static const JavaPermission permission() {354JavaPermission p = {"java.lang.management.ManagementPermission",355"monitor", NULL};356return p;357}358virtual void execute(DCmdSource source, TRAPS);359};360361class ClassHierarchyDCmd : public DCmdWithParser {362protected:363DCmdArgument<bool> _print_interfaces; // true if inherited interfaces should be printed.364DCmdArgument<bool> _print_subclasses; // true if subclasses of the specified classname should be printed.365DCmdArgument<char*> _classname; // Optional single class name whose hierarchy should be printed.366public:367ClassHierarchyDCmd(outputStream* output, bool heap);368static const char* name() {369return "VM.class_hierarchy";370}371static const char* description() {372return "Print a list of all loaded classes, indented to show the class hiearchy. "373"The name of each class is followed by the ClassLoaderData* of its ClassLoader, "374"or \"null\" if loaded by the bootstrap class loader.";375}376static const char* impact() {377return "Medium: Depends on number of loaded classes.";378}379static const JavaPermission permission() {380JavaPermission p = {"java.lang.management.ManagementPermission",381"monitor", NULL};382return p;383}384virtual void execute(DCmdSource source, TRAPS);385};386387class TouchedMethodsDCmd : public DCmd {388public:389TouchedMethodsDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}390static const char* name() {391return "VM.print_touched_methods";392}393static const char* description() {394return "Print all methods that have ever been touched during the lifetime of this JVM.";395}396static const char* impact() {397return "Medium: Depends on Java content.";398}399virtual void execute(DCmdSource source, TRAPS);400};401402#if INCLUDE_CDS403class DumpSharedArchiveDCmd: public DCmdWithParser {404protected:405DCmdArgument<char*> _suboption; // option of VM.cds406DCmdArgument<char*> _filename; // file name, optional407public:408DumpSharedArchiveDCmd(outputStream* output, bool heap);409static const char* name() {410return "VM.cds";411}412static const char* description() {413return "Dump a static or dynamic shared archive including all shareable classes";414}415static const char* impact() {416return "Medium: Pause time depends on number of loaded classes";417}418static const JavaPermission permission() {419JavaPermission p = {"java.lang.management.ManagementPermission",420"monitor", NULL};421return p;422}423static int num_arguments();424virtual void execute(DCmdSource source, TRAPS);425};426#endif // INCLUDE_CDS427428// See also: thread_dump in attachListener.cpp429class ThreadDumpDCmd : public DCmdWithParser {430protected:431DCmdArgument<bool> _locks;432DCmdArgument<bool> _extended;433public:434ThreadDumpDCmd(outputStream* output, bool heap);435static const char* name() { return "Thread.print"; }436static const char* description() {437return "Print all threads with stacktraces.";438}439static const char* impact() {440return "Medium: Depends on the number of threads.";441}442static const JavaPermission permission() {443JavaPermission p = {"java.lang.management.ManagementPermission",444"monitor", NULL};445return p;446}447virtual void execute(DCmdSource source, TRAPS);448};449450// Enhanced JMX Agent support451452class JMXStartRemoteDCmd : public DCmdWithParser {453454// Explicitly list all properties that could be455// passed to Agent.startRemoteManagementAgent()456// com.sun.management is omitted457458DCmdArgument<char *> _config_file;459DCmdArgument<char *> _jmxremote_host;460DCmdArgument<char *> _jmxremote_port;461DCmdArgument<char *> _jmxremote_rmi_port;462DCmdArgument<char *> _jmxremote_ssl;463DCmdArgument<char *> _jmxremote_registry_ssl;464DCmdArgument<char *> _jmxremote_authenticate;465DCmdArgument<char *> _jmxremote_password_file;466DCmdArgument<char *> _jmxremote_access_file;467DCmdArgument<char *> _jmxremote_login_config;468DCmdArgument<char *> _jmxremote_ssl_enabled_cipher_suites;469DCmdArgument<char *> _jmxremote_ssl_enabled_protocols;470DCmdArgument<char *> _jmxremote_ssl_need_client_auth;471DCmdArgument<char *> _jmxremote_ssl_config_file;472473// JDP support474// Keep autodiscovery char* not bool to pass true/false475// as property value to java level.476DCmdArgument<char *> _jmxremote_autodiscovery;477DCmdArgument<jlong> _jdp_port;478DCmdArgument<char *> _jdp_address;479DCmdArgument<char *> _jdp_source_addr;480DCmdArgument<jlong> _jdp_ttl;481DCmdArgument<jlong> _jdp_pause;482DCmdArgument<char *> _jdp_name;483484public:485JMXStartRemoteDCmd(outputStream *output, bool heap_allocated);486487static const char *name() {488return "ManagementAgent.start";489}490491static const char *description() {492return "Start remote management agent.";493}494495virtual void execute(DCmdSource source, TRAPS);496};497498class JMXStartLocalDCmd : public DCmd {499500// Explicitly request start of local agent,501// it will not be started by start dcmd502503504public:505JMXStartLocalDCmd(outputStream *output, bool heap_allocated);506507static const char *name() {508return "ManagementAgent.start_local";509}510511static const char *description() {512return "Start local management agent.";513}514515virtual void execute(DCmdSource source, TRAPS);516517};518519class JMXStopRemoteDCmd : public DCmd {520public:521JMXStopRemoteDCmd(outputStream *output, bool heap_allocated) :522DCmd(output, heap_allocated) {523// Do Nothing524}525526static const char *name() {527return "ManagementAgent.stop";528}529530static const char *description() {531return "Stop remote management agent.";532}533534virtual void execute(DCmdSource source, TRAPS);535};536537// Print the JMX system status538class JMXStatusDCmd : public DCmd {539public:540JMXStatusDCmd(outputStream *output, bool heap_allocated);541542static const char *name() {543return "ManagementAgent.status";544}545546static const char *description() {547return "Print the management agent status.";548}549550static const JavaPermission permission() {551JavaPermission p = {"java.lang.management.ManagementPermission",552"monitor", NULL};553return p;554}555556virtual void execute(DCmdSource source, TRAPS);557558};559560class CompileQueueDCmd : public DCmd {561public:562CompileQueueDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}563static const char* name() {564return "Compiler.queue";565}566static const char* description() {567return "Print methods queued for compilation.";568}569static const char* impact() {570return "Low";571}572static const JavaPermission permission() {573JavaPermission p = {"java.lang.management.ManagementPermission",574"monitor", NULL};575return p;576}577virtual void execute(DCmdSource source, TRAPS);578};579580#ifdef LINUX581class PerfMapDCmd : public DCmd {582public:583PerfMapDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}584static const char* name() {585return "Compiler.perfmap";586}587static const char* description() {588return "Write map file for Linux perf tool.";589}590static const char* impact() {591return "Low";592}593static const JavaPermission permission() {594JavaPermission p = {"java.lang.management.ManagementPermission",595"monitor", NULL};596return p;597}598virtual void execute(DCmdSource source, TRAPS);599};600#endif // LINUX601602class CodeListDCmd : public DCmd {603public:604CodeListDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}605static const char* name() {606return "Compiler.codelist";607}608static const char* description() {609return "Print all compiled methods in code cache that are alive";610}611static const char* impact() {612return "Medium";613}614static const JavaPermission permission() {615JavaPermission p = {"java.lang.management.ManagementPermission",616"monitor", NULL};617return p;618}619virtual void execute(DCmdSource source, TRAPS);620};621622class CodeCacheDCmd : public DCmd {623public:624CodeCacheDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}625static const char* name() {626return "Compiler.codecache";627}628static const char* description() {629return "Print code cache layout and bounds.";630}631static const char* impact() {632return "Low";633}634static const JavaPermission permission() {635JavaPermission p = {"java.lang.management.ManagementPermission",636"monitor", NULL};637return p;638}639virtual void execute(DCmdSource source, TRAPS);640};641642//---< BEGIN >--- CodeHeap State Analytics.643class CodeHeapAnalyticsDCmd : public DCmdWithParser {644protected:645DCmdArgument<char*> _function;646DCmdArgument<jlong> _granularity;647public:648CodeHeapAnalyticsDCmd(outputStream* output, bool heap);649static const char* name() {650return "Compiler.CodeHeap_Analytics";651}652static const char* description() {653return "Print CodeHeap analytics";654}655static const char* impact() {656return "Low: Depends on code heap size and content. "657"Holds CodeCache_lock during analysis step, usually sub-second duration.";658}659static const JavaPermission permission() {660JavaPermission p = {"java.lang.management.ManagementPermission",661"monitor", NULL};662return p;663}664virtual void execute(DCmdSource source, TRAPS);665};666//---< END >--- CodeHeap State Analytics.667668class CompilerDirectivesPrintDCmd : public DCmd {669public:670CompilerDirectivesPrintDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}671static const char* name() {672return "Compiler.directives_print";673}674static const char* description() {675return "Print all active compiler directives.";676}677static const char* impact() {678return "Low";679}680static const JavaPermission permission() {681JavaPermission p = {"java.lang.management.ManagementPermission",682"monitor", NULL};683return p;684}685virtual void execute(DCmdSource source, TRAPS);686};687688class CompilerDirectivesRemoveDCmd : public DCmd {689public:690CompilerDirectivesRemoveDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}691static const char* name() {692return "Compiler.directives_remove";693}694static const char* description() {695return "Remove latest added compiler directive.";696}697static const char* impact() {698return "Low";699}700static const JavaPermission permission() {701JavaPermission p = {"java.lang.management.ManagementPermission",702"monitor", NULL};703return p;704}705virtual void execute(DCmdSource source, TRAPS);706};707708class CompilerDirectivesAddDCmd : public DCmdWithParser {709protected:710DCmdArgument<char*> _filename;711public:712CompilerDirectivesAddDCmd(outputStream* output, bool heap);713static const char* name() {714return "Compiler.directives_add";715}716static const char* description() {717return "Add compiler directives from file.";718}719static const char* impact() {720return "Low";721}722static const JavaPermission permission() {723JavaPermission p = {"java.lang.management.ManagementPermission",724"monitor", NULL};725return p;726}727virtual void execute(DCmdSource source, TRAPS);728};729730class CompilerDirectivesClearDCmd : public DCmd {731public:732CompilerDirectivesClearDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}733static const char* name() {734return "Compiler.directives_clear";735}736static const char* description() {737return "Remove all compiler directives.";738}739static const char* impact() {740return "Low";741}742static const JavaPermission permission() {743JavaPermission p = {"java.lang.management.ManagementPermission",744"monitor", NULL};745return p;746}747virtual void execute(DCmdSource source, TRAPS);748};749750///////////////////////////////////////////////////////////////////////751//752// jcmd command support for symbol table, string table and system dictionary dumping:753// VM.symboltable -verbose: for dumping the symbol table754// VM.stringtable -verbose: for dumping the string table755// VM.systemdictionary -verbose: for dumping the system dictionary table756//757class VM_DumpHashtable : public VM_Operation {758private:759outputStream* _out;760int _which;761bool _verbose;762public:763enum {764DumpSymbols = 1 << 0,765DumpStrings = 1 << 1,766DumpSysDict = 1 << 2 // not implemented yet767};768VM_DumpHashtable(outputStream* out, int which, bool verbose) {769_out = out;770_which = which;771_verbose = verbose;772}773774virtual VMOp_Type type() const { return VMOp_DumpHashtable; }775776virtual void doit() {777switch (_which) {778case DumpSymbols:779SymbolTable::dump(_out, _verbose);780break;781case DumpStrings:782StringTable::dump(_out, _verbose);783break;784case DumpSysDict:785SystemDictionary::dump(_out, _verbose);786break;787default:788ShouldNotReachHere();789}790}791};792793class SymboltableDCmd : public DCmdWithParser {794protected:795DCmdArgument<bool> _verbose;796public:797SymboltableDCmd(outputStream* output, bool heap);798static const char* name() {799return "VM.symboltable";800}801static const char* description() {802return "Dump symbol table.";803}804static const char* impact() {805return "Medium: Depends on Java content.";806}807static const JavaPermission permission() {808JavaPermission p = {"java.lang.management.ManagementPermission",809"monitor", NULL};810return p;811}812virtual void execute(DCmdSource source, TRAPS);813};814815class StringtableDCmd : public DCmdWithParser {816protected:817DCmdArgument<bool> _verbose;818public:819StringtableDCmd(outputStream* output, bool heap);820static const char* name() {821return "VM.stringtable";822}823static const char* description() {824return "Dump string table.";825}826static const char* impact() {827return "Medium: Depends on Java content.";828}829static const JavaPermission permission() {830JavaPermission p = {"java.lang.management.ManagementPermission",831"monitor", NULL};832return p;833}834virtual void execute(DCmdSource source, TRAPS);835};836837class SystemDictionaryDCmd : public DCmdWithParser {838protected:839DCmdArgument<bool> _verbose;840public:841SystemDictionaryDCmd(outputStream* output, bool heap);842static const char* name() {843return "VM.systemdictionary";844}845static const char* description() {846return "Prints the statistics for dictionary hashtable sizes and bucket length";847}848static const char* impact() {849return "Medium: Depends on Java content.";850}851static const JavaPermission permission() {852JavaPermission p = {"java.lang.management.ManagementPermission",853"monitor", NULL};854return p;855}856virtual void execute(DCmdSource source, TRAPS);857};858859#if INCLUDE_JVMTI860class DebugOnCmdStartDCmd : public DCmd {861public:862DebugOnCmdStartDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}863static const char* name() {864return "VM.start_java_debugging";865}866static const char* description() {867return "Starts up the Java debugging if the jdwp agentlib was enabled with the option onjcmd=y.";868}869static const char* impact() {870return "High: Switches the VM into Java debug mode.";871}872static const JavaPermission permission() {873JavaPermission p = { "java.lang.management.ManagementPermission", "control", NULL };874return p;875}876virtual void execute(DCmdSource source, TRAPS);877};878#endif // INCLUDE_JVMTI879880class EventLogDCmd : public DCmdWithParser {881protected:882DCmdArgument<char*> _log;883DCmdArgument<char*> _max;884public:885EventLogDCmd(outputStream* output, bool heap);886static const char* name() {887return "VM.events";888}889static const char* description() {890return "Print VM event logs";891}892static const char* impact() {893return "Low: Depends on event log size. ";894}895static const JavaPermission permission() {896JavaPermission p = {"java.lang.management.ManagementPermission",897"monitor", NULL};898return p;899}900virtual void execute(DCmdSource source, TRAPS);901};902903#endif // SHARE_SERVICES_DIAGNOSTICCOMMAND_HPP904905906