Path: blob/master/src/hotspot/share/services/diagnosticCommand.hpp
64441 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;316DCmdArgument<bool> _overwrite;317public:318HeapDumpDCmd(outputStream* output, bool heap);319static const char* name() {320return "GC.heap_dump";321}322static const char* description() {323return "Generate a HPROF format dump of the Java heap.";324}325static const char* impact() {326return "High: Depends on Java heap size and content. "327"Request a full GC unless the '-all' option is specified.";328}329static const JavaPermission permission() {330JavaPermission p = {"java.lang.management.ManagementPermission",331"monitor", NULL};332return p;333}334virtual void execute(DCmdSource source, TRAPS);335};336#endif // INCLUDE_SERVICES337338// See also: inspectheap in attachListener.cpp339class ClassHistogramDCmd : public DCmdWithParser {340protected:341DCmdArgument<bool> _all;342DCmdArgument<jlong> _parallel_thread_num;343public:344ClassHistogramDCmd(outputStream* output, bool heap);345static const char* name() {346return "GC.class_histogram";347}348static const char* description() {349return "Provide statistics about the Java heap usage.";350}351static const char* impact() {352return "High: Depends on Java heap size and content.";353}354static const JavaPermission permission() {355JavaPermission p = {"java.lang.management.ManagementPermission",356"monitor", NULL};357return p;358}359virtual void execute(DCmdSource source, TRAPS);360};361362class ClassHierarchyDCmd : public DCmdWithParser {363protected:364DCmdArgument<bool> _print_interfaces; // true if inherited interfaces should be printed.365DCmdArgument<bool> _print_subclasses; // true if subclasses of the specified classname should be printed.366DCmdArgument<char*> _classname; // Optional single class name whose hierarchy should be printed.367public:368ClassHierarchyDCmd(outputStream* output, bool heap);369static const char* name() {370return "VM.class_hierarchy";371}372static const char* description() {373return "Print a list of all loaded classes, indented to show the class hiearchy. "374"The name of each class is followed by the ClassLoaderData* of its ClassLoader, "375"or \"null\" if loaded by the bootstrap class loader.";376}377static const char* impact() {378return "Medium: Depends on number of loaded classes.";379}380static const JavaPermission permission() {381JavaPermission p = {"java.lang.management.ManagementPermission",382"monitor", NULL};383return p;384}385virtual void execute(DCmdSource source, TRAPS);386};387388class TouchedMethodsDCmd : public DCmd {389public:390TouchedMethodsDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}391static const char* name() {392return "VM.print_touched_methods";393}394static const char* description() {395return "Print all methods that have ever been touched during the lifetime of this JVM.";396}397static const char* impact() {398return "Medium: Depends on Java content.";399}400virtual void execute(DCmdSource source, TRAPS);401};402403#if INCLUDE_CDS404class DumpSharedArchiveDCmd: public DCmdWithParser {405protected:406DCmdArgument<char*> _suboption; // option of VM.cds407DCmdArgument<char*> _filename; // file name, optional408public:409DumpSharedArchiveDCmd(outputStream* output, bool heap);410static const char* name() {411return "VM.cds";412}413static const char* description() {414return "Dump a static or dynamic shared archive including all shareable classes";415}416static const char* impact() {417return "Medium: Pause time depends on number of loaded classes";418}419static const JavaPermission permission() {420JavaPermission p = {"java.lang.management.ManagementPermission",421"monitor", NULL};422return p;423}424static int num_arguments();425virtual void execute(DCmdSource source, TRAPS);426};427#endif // INCLUDE_CDS428429// See also: thread_dump in attachListener.cpp430class ThreadDumpDCmd : public DCmdWithParser {431protected:432DCmdArgument<bool> _locks;433DCmdArgument<bool> _extended;434public:435ThreadDumpDCmd(outputStream* output, bool heap);436static const char* name() { return "Thread.print"; }437static const char* description() {438return "Print all threads with stacktraces.";439}440static const char* impact() {441return "Medium: Depends on the number of threads.";442}443static const JavaPermission permission() {444JavaPermission p = {"java.lang.management.ManagementPermission",445"monitor", NULL};446return p;447}448virtual void execute(DCmdSource source, TRAPS);449};450451// Enhanced JMX Agent support452453class JMXStartRemoteDCmd : public DCmdWithParser {454455// Explicitly list all properties that could be456// passed to Agent.startRemoteManagementAgent()457// com.sun.management is omitted458459DCmdArgument<char *> _config_file;460DCmdArgument<char *> _jmxremote_host;461DCmdArgument<char *> _jmxremote_port;462DCmdArgument<char *> _jmxremote_rmi_port;463DCmdArgument<char *> _jmxremote_ssl;464DCmdArgument<char *> _jmxremote_registry_ssl;465DCmdArgument<char *> _jmxremote_authenticate;466DCmdArgument<char *> _jmxremote_password_file;467DCmdArgument<char *> _jmxremote_access_file;468DCmdArgument<char *> _jmxremote_login_config;469DCmdArgument<char *> _jmxremote_ssl_enabled_cipher_suites;470DCmdArgument<char *> _jmxremote_ssl_enabled_protocols;471DCmdArgument<char *> _jmxremote_ssl_need_client_auth;472DCmdArgument<char *> _jmxremote_ssl_config_file;473474// JDP support475// Keep autodiscovery char* not bool to pass true/false476// as property value to java level.477DCmdArgument<char *> _jmxremote_autodiscovery;478DCmdArgument<jlong> _jdp_port;479DCmdArgument<char *> _jdp_address;480DCmdArgument<char *> _jdp_source_addr;481DCmdArgument<jlong> _jdp_ttl;482DCmdArgument<jlong> _jdp_pause;483DCmdArgument<char *> _jdp_name;484485public:486JMXStartRemoteDCmd(outputStream *output, bool heap_allocated);487488static const char *name() {489return "ManagementAgent.start";490}491492static const char *description() {493return "Start remote management agent.";494}495496virtual void execute(DCmdSource source, TRAPS);497};498499class JMXStartLocalDCmd : public DCmd {500501// Explicitly request start of local agent,502// it will not be started by start dcmd503504505public:506JMXStartLocalDCmd(outputStream *output, bool heap_allocated);507508static const char *name() {509return "ManagementAgent.start_local";510}511512static const char *description() {513return "Start local management agent.";514}515516virtual void execute(DCmdSource source, TRAPS);517518};519520class JMXStopRemoteDCmd : public DCmd {521public:522JMXStopRemoteDCmd(outputStream *output, bool heap_allocated) :523DCmd(output, heap_allocated) {524// Do Nothing525}526527static const char *name() {528return "ManagementAgent.stop";529}530531static const char *description() {532return "Stop remote management agent.";533}534535virtual void execute(DCmdSource source, TRAPS);536};537538// Print the JMX system status539class JMXStatusDCmd : public DCmd {540public:541JMXStatusDCmd(outputStream *output, bool heap_allocated);542543static const char *name() {544return "ManagementAgent.status";545}546547static const char *description() {548return "Print the management agent status.";549}550551static const JavaPermission permission() {552JavaPermission p = {"java.lang.management.ManagementPermission",553"monitor", NULL};554return p;555}556557virtual void execute(DCmdSource source, TRAPS);558559};560561class CompileQueueDCmd : public DCmd {562public:563CompileQueueDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}564static const char* name() {565return "Compiler.queue";566}567static const char* description() {568return "Print methods queued for compilation.";569}570static const char* impact() {571return "Low";572}573static const JavaPermission permission() {574JavaPermission p = {"java.lang.management.ManagementPermission",575"monitor", NULL};576return p;577}578virtual void execute(DCmdSource source, TRAPS);579};580581#ifdef LINUX582class PerfMapDCmd : public DCmd {583public:584PerfMapDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}585static const char* name() {586return "Compiler.perfmap";587}588static const char* description() {589return "Write map file for Linux perf tool.";590}591static const char* impact() {592return "Low";593}594static const JavaPermission permission() {595JavaPermission p = {"java.lang.management.ManagementPermission",596"monitor", NULL};597return p;598}599virtual void execute(DCmdSource source, TRAPS);600};601#endif // LINUX602603class CodeListDCmd : public DCmd {604public:605CodeListDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}606static const char* name() {607return "Compiler.codelist";608}609static const char* description() {610return "Print all compiled methods in code cache that are alive";611}612static const char* impact() {613return "Medium";614}615static const JavaPermission permission() {616JavaPermission p = {"java.lang.management.ManagementPermission",617"monitor", NULL};618return p;619}620virtual void execute(DCmdSource source, TRAPS);621};622623class CodeCacheDCmd : public DCmd {624public:625CodeCacheDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}626static const char* name() {627return "Compiler.codecache";628}629static const char* description() {630return "Print code cache layout and bounds.";631}632static const char* impact() {633return "Low";634}635static const JavaPermission permission() {636JavaPermission p = {"java.lang.management.ManagementPermission",637"monitor", NULL};638return p;639}640virtual void execute(DCmdSource source, TRAPS);641};642643//---< BEGIN >--- CodeHeap State Analytics.644class CodeHeapAnalyticsDCmd : public DCmdWithParser {645protected:646DCmdArgument<char*> _function;647DCmdArgument<jlong> _granularity;648public:649CodeHeapAnalyticsDCmd(outputStream* output, bool heap);650static const char* name() {651return "Compiler.CodeHeap_Analytics";652}653static const char* description() {654return "Print CodeHeap analytics";655}656static const char* impact() {657return "Low: Depends on code heap size and content. "658"Holds CodeCache_lock during analysis step, usually sub-second duration.";659}660static const JavaPermission permission() {661JavaPermission p = {"java.lang.management.ManagementPermission",662"monitor", NULL};663return p;664}665virtual void execute(DCmdSource source, TRAPS);666};667//---< END >--- CodeHeap State Analytics.668669class CompilerDirectivesPrintDCmd : public DCmd {670public:671CompilerDirectivesPrintDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}672static const char* name() {673return "Compiler.directives_print";674}675static const char* description() {676return "Print all active compiler directives.";677}678static const char* impact() {679return "Low";680}681static const JavaPermission permission() {682JavaPermission p = {"java.lang.management.ManagementPermission",683"monitor", NULL};684return p;685}686virtual void execute(DCmdSource source, TRAPS);687};688689class CompilerDirectivesRemoveDCmd : public DCmd {690public:691CompilerDirectivesRemoveDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}692static const char* name() {693return "Compiler.directives_remove";694}695static const char* description() {696return "Remove latest added compiler directive.";697}698static const char* impact() {699return "Low";700}701static const JavaPermission permission() {702JavaPermission p = {"java.lang.management.ManagementPermission",703"monitor", NULL};704return p;705}706virtual void execute(DCmdSource source, TRAPS);707};708709class CompilerDirectivesAddDCmd : public DCmdWithParser {710protected:711DCmdArgument<char*> _filename;712public:713CompilerDirectivesAddDCmd(outputStream* output, bool heap);714static const char* name() {715return "Compiler.directives_add";716}717static const char* description() {718return "Add compiler directives from file.";719}720static const char* impact() {721return "Low";722}723static const JavaPermission permission() {724JavaPermission p = {"java.lang.management.ManagementPermission",725"monitor", NULL};726return p;727}728virtual void execute(DCmdSource source, TRAPS);729};730731class CompilerDirectivesClearDCmd : public DCmd {732public:733CompilerDirectivesClearDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}734static const char* name() {735return "Compiler.directives_clear";736}737static const char* description() {738return "Remove all compiler directives.";739}740static const char* impact() {741return "Low";742}743static const JavaPermission permission() {744JavaPermission p = {"java.lang.management.ManagementPermission",745"monitor", NULL};746return p;747}748virtual void execute(DCmdSource source, TRAPS);749};750751///////////////////////////////////////////////////////////////////////752//753// jcmd command support for symbol table, string table and system dictionary dumping:754// VM.symboltable -verbose: for dumping the symbol table755// VM.stringtable -verbose: for dumping the string table756// VM.systemdictionary -verbose: for dumping the system dictionary table757//758class VM_DumpHashtable : public VM_Operation {759private:760outputStream* _out;761int _which;762bool _verbose;763public:764enum {765DumpSymbols = 1 << 0,766DumpStrings = 1 << 1,767DumpSysDict = 1 << 2 // not implemented yet768};769VM_DumpHashtable(outputStream* out, int which, bool verbose) {770_out = out;771_which = which;772_verbose = verbose;773}774775virtual VMOp_Type type() const { return VMOp_DumpHashtable; }776777virtual void doit() {778switch (_which) {779case DumpSymbols:780SymbolTable::dump(_out, _verbose);781break;782case DumpStrings:783StringTable::dump(_out, _verbose);784break;785case DumpSysDict:786SystemDictionary::dump(_out, _verbose);787break;788default:789ShouldNotReachHere();790}791}792};793794class SymboltableDCmd : public DCmdWithParser {795protected:796DCmdArgument<bool> _verbose;797public:798SymboltableDCmd(outputStream* output, bool heap);799static const char* name() {800return "VM.symboltable";801}802static const char* description() {803return "Dump symbol table.";804}805static const char* impact() {806return "Medium: Depends on Java content.";807}808static const JavaPermission permission() {809JavaPermission p = {"java.lang.management.ManagementPermission",810"monitor", NULL};811return p;812}813virtual void execute(DCmdSource source, TRAPS);814};815816class StringtableDCmd : public DCmdWithParser {817protected:818DCmdArgument<bool> _verbose;819public:820StringtableDCmd(outputStream* output, bool heap);821static const char* name() {822return "VM.stringtable";823}824static const char* description() {825return "Dump string table.";826}827static const char* impact() {828return "Medium: Depends on Java content.";829}830static const JavaPermission permission() {831JavaPermission p = {"java.lang.management.ManagementPermission",832"monitor", NULL};833return p;834}835virtual void execute(DCmdSource source, TRAPS);836};837838class SystemDictionaryDCmd : public DCmdWithParser {839protected:840DCmdArgument<bool> _verbose;841public:842SystemDictionaryDCmd(outputStream* output, bool heap);843static const char* name() {844return "VM.systemdictionary";845}846static const char* description() {847return "Prints the statistics for dictionary hashtable sizes and bucket length";848}849static const char* impact() {850return "Medium: Depends on Java content.";851}852static const JavaPermission permission() {853JavaPermission p = {"java.lang.management.ManagementPermission",854"monitor", NULL};855return p;856}857virtual void execute(DCmdSource source, TRAPS);858};859860#if INCLUDE_JVMTI861class DebugOnCmdStartDCmd : public DCmd {862public:863DebugOnCmdStartDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}864static const char* name() {865return "VM.start_java_debugging";866}867static const char* description() {868return "Starts up the Java debugging if the jdwp agentlib was enabled with the option onjcmd=y.";869}870static const char* impact() {871return "High: Switches the VM into Java debug mode.";872}873static const JavaPermission permission() {874JavaPermission p = { "java.lang.management.ManagementPermission", "control", NULL };875return p;876}877virtual void execute(DCmdSource source, TRAPS);878};879#endif // INCLUDE_JVMTI880881class EventLogDCmd : public DCmdWithParser {882protected:883DCmdArgument<char*> _log;884DCmdArgument<char*> _max;885public:886EventLogDCmd(outputStream* output, bool heap);887static const char* name() {888return "VM.events";889}890static const char* description() {891return "Print VM event logs";892}893static const char* impact() {894return "Low: Depends on event log size. ";895}896static const JavaPermission permission() {897JavaPermission p = {"java.lang.management.ManagementPermission",898"monitor", NULL};899return p;900}901virtual void execute(DCmdSource source, TRAPS);902};903904#endif // SHARE_SERVICES_DIAGNOSTICCOMMAND_HPP905906907