Wed, 27 Aug 2014 09:36:55 +0200
Merge
1 /*
2 * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
25 #ifndef SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP
26 #define SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP
28 #include "runtime/arguments.hpp"
29 #include "classfile/vmSymbols.hpp"
30 #include "utilities/ostream.hpp"
31 #include "runtime/vm_version.hpp"
32 #include "runtime/vmThread.hpp"
33 #include "runtime/os.hpp"
34 #include "services/diagnosticArgument.hpp"
35 #include "services/diagnosticCommand.hpp"
36 #include "services/diagnosticFramework.hpp"
37 #include "services/diagnosticCommand_ext.hpp"
38 #include "utilities/macros.hpp"
40 class HelpDCmd : public DCmdWithParser {
41 protected:
42 DCmdArgument<bool> _all;
43 DCmdArgument<char*> _cmd;
44 public:
45 HelpDCmd(outputStream* output, bool heap);
46 static const char* name() { return "help"; }
47 static const char* description() {
48 return "For more information about a specific command use 'help <command>'. "
49 "With no argument this will show a list of available commands. "
50 "'help all' will show help for all commands.";
51 }
52 static const char* impact() { return "Low"; }
53 static int num_arguments();
54 virtual void execute(DCmdSource source, TRAPS);
55 };
57 class VersionDCmd : public DCmd {
58 public:
59 VersionDCmd(outputStream* output, bool heap) : DCmd(output,heap) { }
60 static const char* name() { return "VM.version"; }
61 static const char* description() {
62 return "Print JVM version information.";
63 }
64 static const char* impact() { return "Low"; }
65 static const JavaPermission permission() {
66 JavaPermission p = {"java.util.PropertyPermission",
67 "java.vm.version", "read"};
68 return p;
69 }
70 static int num_arguments() { return 0; }
71 virtual void execute(DCmdSource source, TRAPS);
72 };
74 class CommandLineDCmd : public DCmd {
75 public:
76 CommandLineDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
77 static const char* name() { return "VM.command_line"; }
78 static const char* description() {
79 return "Print the command line used to start this VM instance.";
80 }
81 static const char* impact() { return "Low"; }
82 static const JavaPermission permission() {
83 JavaPermission p = {"java.lang.management.ManagementPermission",
84 "monitor", NULL};
85 return p;
86 }
87 static int num_arguments() { return 0; }
88 virtual void execute(DCmdSource source, TRAPS) {
89 Arguments::print_on(_output);
90 }
91 };
93 // See also: get_system_properties in attachListener.cpp
94 class PrintSystemPropertiesDCmd : public DCmd {
95 public:
96 PrintSystemPropertiesDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
97 static const char* name() { return "VM.system_properties"; }
98 static const char* description() {
99 return "Print system properties.";
100 }
101 static const char* impact() {
102 return "Low";
103 }
104 static const JavaPermission permission() {
105 JavaPermission p = {"java.util.PropertyPermission",
106 "*", "read"};
107 return p;
108 }
109 static int num_arguments() { return 0; }
110 virtual void execute(DCmdSource source, TRAPS);
111 };
113 // See also: print_flag in attachListener.cpp
114 class PrintVMFlagsDCmd : public DCmdWithParser {
115 protected:
116 DCmdArgument<bool> _all;
117 public:
118 PrintVMFlagsDCmd(outputStream* output, bool heap);
119 static const char* name() { return "VM.flags"; }
120 static const char* description() {
121 return "Print VM flag options and their current values.";
122 }
123 static const char* impact() {
124 return "Low";
125 }
126 static const JavaPermission permission() {
127 JavaPermission p = {"java.lang.management.ManagementPermission",
128 "monitor", NULL};
129 return p;
130 }
131 static int num_arguments();
132 virtual void execute(DCmdSource source, TRAPS);
133 };
135 class VMUptimeDCmd : public DCmdWithParser {
136 protected:
137 DCmdArgument<bool> _date;
138 public:
139 VMUptimeDCmd(outputStream* output, bool heap);
140 static const char* name() { return "VM.uptime"; }
141 static const char* description() {
142 return "Print VM uptime.";
143 }
144 static const char* impact() {
145 return "Low";
146 }
147 static int num_arguments();
148 virtual void execute(DCmdSource source, TRAPS);
149 };
151 class SystemGCDCmd : public DCmd {
152 public:
153 SystemGCDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
154 static const char* name() { return "GC.run"; }
155 static const char* description() {
156 return "Call java.lang.System.gc().";
157 }
158 static const char* impact() {
159 return "Medium: Depends on Java heap size and content.";
160 }
161 static int num_arguments() { return 0; }
162 virtual void execute(DCmdSource source, TRAPS);
163 };
165 class RunFinalizationDCmd : public DCmd {
166 public:
167 RunFinalizationDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
168 static const char* name() { return "GC.run_finalization"; }
169 static const char* description() {
170 return "Call java.lang.System.runFinalization().";
171 }
172 static const char* impact() {
173 return "Medium: Depends on Java content.";
174 }
175 static int num_arguments() { return 0; }
176 virtual void execute(DCmdSource source, TRAPS);
177 };
179 #if INCLUDE_SERVICES // Heap dumping supported
180 // See also: dump_heap in attachListener.cpp
181 class HeapDumpDCmd : public DCmdWithParser {
182 protected:
183 DCmdArgument<char*> _filename;
184 DCmdArgument<bool> _all;
185 public:
186 HeapDumpDCmd(outputStream* output, bool heap);
187 static const char* name() {
188 return "GC.heap_dump";
189 }
190 static const char* description() {
191 return "Generate a HPROF format dump of the Java heap.";
192 }
193 static const char* impact() {
194 return "High: Depends on Java heap size and content. "
195 "Request a full GC unless the '-all' option is specified.";
196 }
197 static const JavaPermission permission() {
198 JavaPermission p = {"java.lang.management.ManagementPermission",
199 "monitor", NULL};
200 return p;
201 }
202 static int num_arguments();
203 virtual void execute(DCmdSource source, TRAPS);
204 };
205 #endif // INCLUDE_SERVICES
207 // See also: inspectheap in attachListener.cpp
208 class ClassHistogramDCmd : public DCmdWithParser {
209 protected:
210 DCmdArgument<bool> _all;
211 public:
212 ClassHistogramDCmd(outputStream* output, bool heap);
213 static const char* name() {
214 return "GC.class_histogram";
215 }
216 static const char* description() {
217 return "Provide statistics about the Java heap usage.";
218 }
219 static const char* impact() {
220 return "High: Depends on Java heap size and content.";
221 }
222 static const JavaPermission permission() {
223 JavaPermission p = {"java.lang.management.ManagementPermission",
224 "monitor", NULL};
225 return p;
226 }
227 static int num_arguments();
228 virtual void execute(DCmdSource source, TRAPS);
229 };
231 class ClassStatsDCmd : public DCmdWithParser {
232 protected:
233 DCmdArgument<bool> _all;
234 DCmdArgument<bool> _csv;
235 DCmdArgument<bool> _help;
236 DCmdArgument<char*> _columns;
237 public:
238 ClassStatsDCmd(outputStream* output, bool heap);
239 static const char* name() {
240 return "GC.class_stats";
241 }
242 static const char* description() {
243 return "Provide statistics about Java class meta data. Requires -XX:+UnlockDiagnosticVMOptions.";
244 }
245 static const char* impact() {
246 return "High: Depends on Java heap size and content.";
247 }
248 static int num_arguments();
249 virtual void execute(DCmdSource source, TRAPS);
250 };
252 // See also: thread_dump in attachListener.cpp
253 class ThreadDumpDCmd : public DCmdWithParser {
254 protected:
255 DCmdArgument<bool> _locks;
256 public:
257 ThreadDumpDCmd(outputStream* output, bool heap);
258 static const char* name() { return "Thread.print"; }
259 static const char* description() {
260 return "Print all threads with stacktraces.";
261 }
262 static const char* impact() {
263 return "Medium: Depends on the number of threads.";
264 }
265 static const JavaPermission permission() {
266 JavaPermission p = {"java.lang.management.ManagementPermission",
267 "monitor", NULL};
268 return p;
269 }
270 static int num_arguments();
271 virtual void execute(DCmdSource source, TRAPS);
272 };
274 // Enhanced JMX Agent support
276 class JMXStartRemoteDCmd : public DCmdWithParser {
278 // Explicitly list all properties that could be
279 // passed to Agent.startRemoteManagementAgent()
280 // com.sun.management is omitted
282 DCmdArgument<char *> _config_file;
283 DCmdArgument<char *> _jmxremote_port;
284 DCmdArgument<char *> _jmxremote_rmi_port;
285 DCmdArgument<char *> _jmxremote_ssl;
286 DCmdArgument<char *> _jmxremote_registry_ssl;
287 DCmdArgument<char *> _jmxremote_authenticate;
288 DCmdArgument<char *> _jmxremote_password_file;
289 DCmdArgument<char *> _jmxremote_access_file;
290 DCmdArgument<char *> _jmxremote_login_config;
291 DCmdArgument<char *> _jmxremote_ssl_enabled_cipher_suites;
292 DCmdArgument<char *> _jmxremote_ssl_enabled_protocols;
293 DCmdArgument<char *> _jmxremote_ssl_need_client_auth;
294 DCmdArgument<char *> _jmxremote_ssl_config_file;
296 // JDP support
297 // Keep autodiscovery char* not bool to pass true/false
298 // as property value to java level.
299 DCmdArgument<char *> _jmxremote_autodiscovery;
300 DCmdArgument<jlong> _jdp_port;
301 DCmdArgument<char *> _jdp_address;
302 DCmdArgument<char *> _jdp_source_addr;
303 DCmdArgument<jlong> _jdp_ttl;
304 DCmdArgument<jlong> _jdp_pause;
305 DCmdArgument<char *> _jdp_name;
307 public:
308 JMXStartRemoteDCmd(outputStream *output, bool heap_allocated);
310 static const char *name() {
311 return "ManagementAgent.start";
312 }
314 static const char *description() {
315 return "Start remote management agent.";
316 }
318 static int num_arguments();
320 virtual void execute(DCmdSource source, TRAPS);
322 };
324 class JMXStartLocalDCmd : public DCmd {
326 // Explicitly request start of local agent,
327 // it will not be started by start dcmd
330 public:
331 JMXStartLocalDCmd(outputStream *output, bool heap_allocated);
333 static const char *name() {
334 return "ManagementAgent.start_local";
335 }
337 static const char *description() {
338 return "Start local management agent.";
339 }
341 virtual void execute(DCmdSource source, TRAPS);
343 };
345 class JMXStopRemoteDCmd : public DCmd {
346 public:
347 JMXStopRemoteDCmd(outputStream *output, bool heap_allocated) :
348 DCmd(output, heap_allocated) {
349 // Do Nothing
350 }
352 static const char *name() {
353 return "ManagementAgent.stop";
354 }
356 static const char *description() {
357 return "Stop remote management agent.";
358 }
360 virtual void execute(DCmdSource source, TRAPS);
361 };
363 class RotateGCLogDCmd : public DCmd {
364 public:
365 RotateGCLogDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}
366 static const char* name() { return "GC.rotate_log"; }
367 static const char* description() {
368 return "Force the GC log file to be rotated.";
369 }
370 static const char* impact() { return "Low"; }
371 virtual void execute(DCmdSource source, TRAPS);
372 static int num_arguments() { return 0; }
373 static const JavaPermission permission() {
374 JavaPermission p = {"java.lang.management.ManagementPermission",
375 "control", NULL};
376 return p;
377 }
378 };
380 #endif // SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP