1 | /* |
2 | * Copyright (c) 2011, 2019, 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 | */ |
24 | |
25 | #ifndef SHARE_SERVICES_DIAGNOSTICCOMMAND_HPP |
26 | #define SHARE_SERVICES_DIAGNOSTICCOMMAND_HPP |
27 | |
28 | #include "classfile/stringTable.hpp" |
29 | #include "classfile/symbolTable.hpp" |
30 | #include "classfile/systemDictionary.hpp" |
31 | #include "classfile/vmSymbols.hpp" |
32 | #include "runtime/arguments.hpp" |
33 | #include "runtime/os.hpp" |
34 | #include "runtime/vmThread.hpp" |
35 | #include "services/diagnosticArgument.hpp" |
36 | #include "services/diagnosticCommand.hpp" |
37 | #include "services/diagnosticFramework.hpp" |
38 | #include "utilities/macros.hpp" |
39 | #include "utilities/ostream.hpp" |
40 | #include "oops/method.hpp" |
41 | |
42 | class HelpDCmd : public DCmdWithParser { |
43 | protected: |
44 | DCmdArgument<bool> _all; |
45 | DCmdArgument<char*> _cmd; |
46 | public: |
47 | HelpDCmd(outputStream* output, bool heap); |
48 | static const char* name() { return "help" ; } |
49 | static const char* description() { |
50 | return "For more information about a specific command use 'help <command>'. " |
51 | "With no argument this will show a list of available commands. " |
52 | "'help all' will show help for all commands." ; |
53 | } |
54 | static const char* impact() { return "Low" ; } |
55 | static int num_arguments(); |
56 | virtual void execute(DCmdSource source, TRAPS); |
57 | }; |
58 | |
59 | class VersionDCmd : public DCmd { |
60 | public: |
61 | VersionDCmd(outputStream* output, bool heap) : DCmd(output,heap) { } |
62 | static const char* name() { return "VM.version" ; } |
63 | static const char* description() { |
64 | return "Print JVM version information." ; |
65 | } |
66 | static const char* impact() { return "Low" ; } |
67 | static const JavaPermission permission() { |
68 | JavaPermission p = {"java.util.PropertyPermission" , |
69 | "java.vm.version" , "read" }; |
70 | return p; |
71 | } |
72 | static int num_arguments() { return 0; } |
73 | virtual void execute(DCmdSource source, TRAPS); |
74 | }; |
75 | |
76 | class CommandLineDCmd : public DCmd { |
77 | public: |
78 | CommandLineDCmd(outputStream* output, bool heap) : DCmd(output, heap) { } |
79 | static const char* name() { return "VM.command_line" ; } |
80 | static const char* description() { |
81 | return "Print the command line used to start this VM instance." ; |
82 | } |
83 | static const char* impact() { return "Low" ; } |
84 | static const JavaPermission permission() { |
85 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
86 | "monitor" , NULL}; |
87 | return p; |
88 | } |
89 | static int num_arguments() { return 0; } |
90 | virtual void execute(DCmdSource source, TRAPS) { |
91 | Arguments::print_on(_output); |
92 | } |
93 | }; |
94 | |
95 | // See also: get_system_properties in attachListener.cpp |
96 | class PrintSystemPropertiesDCmd : public DCmd { |
97 | public: |
98 | PrintSystemPropertiesDCmd(outputStream* output, bool heap) : DCmd(output, heap) { } |
99 | static const char* name() { return "VM.system_properties" ; } |
100 | static const char* description() { |
101 | return "Print system properties." ; |
102 | } |
103 | static const char* impact() { |
104 | return "Low" ; |
105 | } |
106 | static const JavaPermission permission() { |
107 | JavaPermission p = {"java.util.PropertyPermission" , |
108 | "*" , "read" }; |
109 | return p; |
110 | } |
111 | static int num_arguments() { return 0; } |
112 | virtual void execute(DCmdSource source, TRAPS); |
113 | }; |
114 | |
115 | // See also: print_flag in attachListener.cpp |
116 | class PrintVMFlagsDCmd : public DCmdWithParser { |
117 | protected: |
118 | DCmdArgument<bool> _all; |
119 | public: |
120 | PrintVMFlagsDCmd(outputStream* output, bool heap); |
121 | static const char* name() { return "VM.flags" ; } |
122 | static const char* description() { |
123 | return "Print VM flag options and their current values." ; |
124 | } |
125 | static const char* impact() { |
126 | return "Low" ; |
127 | } |
128 | static const JavaPermission permission() { |
129 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
130 | "monitor" , NULL}; |
131 | return p; |
132 | } |
133 | static int num_arguments(); |
134 | virtual void execute(DCmdSource source, TRAPS); |
135 | }; |
136 | |
137 | class SetVMFlagDCmd : public DCmdWithParser { |
138 | protected: |
139 | DCmdArgument<char*> _flag; |
140 | DCmdArgument<char*> _value; |
141 | |
142 | public: |
143 | SetVMFlagDCmd(outputStream* output, bool heap); |
144 | static const char* name() { return "VM.set_flag" ; } |
145 | static const char* description() { |
146 | return "Sets VM flag option using the provided value." ; |
147 | } |
148 | static const char* impact() { |
149 | return "Low" ; |
150 | } |
151 | static const JavaPermission permission() { |
152 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
153 | "control" , NULL}; |
154 | return p; |
155 | } |
156 | static int num_arguments(); |
157 | virtual void execute(DCmdSource source, TRAPS); |
158 | }; |
159 | |
160 | class JVMTIDataDumpDCmd : public DCmd { |
161 | public: |
162 | JVMTIDataDumpDCmd(outputStream* output, bool heap) : DCmd(output, heap) { } |
163 | static const char* name() { return "JVMTI.data_dump" ; } |
164 | static const char* description() { |
165 | return "Signal the JVM to do a data-dump request for JVMTI." ; |
166 | } |
167 | static const char* impact() { |
168 | return "High" ; |
169 | } |
170 | static const JavaPermission permission() { |
171 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
172 | "monitor" , NULL}; |
173 | return p; |
174 | } |
175 | static int num_arguments() { return 0; } |
176 | virtual void execute(DCmdSource source, TRAPS); |
177 | }; |
178 | |
179 | #if INCLUDE_SERVICES |
180 | #if INCLUDE_JVMTI |
181 | class JVMTIAgentLoadDCmd : public DCmdWithParser { |
182 | protected: |
183 | DCmdArgument<char*> _libpath; |
184 | DCmdArgument<char*> _option; |
185 | public: |
186 | JVMTIAgentLoadDCmd(outputStream* output, bool heap); |
187 | static const char* name() { return "JVMTI.agent_load" ; } |
188 | static const char* description() { |
189 | return "Load JVMTI native agent." ; |
190 | } |
191 | static const char* impact() { return "Low" ; } |
192 | static const JavaPermission permission() { |
193 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
194 | "control" , NULL}; |
195 | return p; |
196 | } |
197 | static int num_arguments(); |
198 | virtual void execute(DCmdSource source, TRAPS); |
199 | }; |
200 | #endif // INCLUDE_JVMTI |
201 | #endif // INCLUDE_SERVICES |
202 | |
203 | class VMDynamicLibrariesDCmd : public DCmd { |
204 | public: |
205 | VMDynamicLibrariesDCmd(outputStream* output, bool heap); |
206 | static const char* name() { |
207 | return "VM.dynlibs" ; |
208 | } |
209 | static const char* description() { |
210 | return "Print loaded dynamic libraries." ; |
211 | } |
212 | static const char* impact() { |
213 | return "Low" ; |
214 | } |
215 | static const JavaPermission permission() { |
216 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
217 | "monitor" , NULL}; |
218 | return p; |
219 | } |
220 | static int num_arguments() { |
221 | return 0; |
222 | }; |
223 | virtual void execute(DCmdSource source, TRAPS); |
224 | }; |
225 | |
226 | class VMUptimeDCmd : public DCmdWithParser { |
227 | protected: |
228 | DCmdArgument<bool> _date; |
229 | public: |
230 | VMUptimeDCmd(outputStream* output, bool heap); |
231 | static const char* name() { return "VM.uptime" ; } |
232 | static const char* description() { |
233 | return "Print VM uptime." ; |
234 | } |
235 | static const char* impact() { |
236 | return "Low" ; |
237 | } |
238 | static int num_arguments(); |
239 | virtual void execute(DCmdSource source, TRAPS); |
240 | }; |
241 | |
242 | class VMInfoDCmd : public DCmd { |
243 | public: |
244 | VMInfoDCmd(outputStream* output, bool heap) : DCmd(output, heap) { } |
245 | static const char* name() { return "VM.info" ; } |
246 | static const char* description() { |
247 | return "Print information about JVM environment and status." ; |
248 | } |
249 | static const char* impact() { return "Low" ; } |
250 | static const JavaPermission permission() { |
251 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
252 | "monitor" , NULL}; |
253 | return p; |
254 | } |
255 | static int num_arguments() { return 0; } |
256 | virtual void execute(DCmdSource source, TRAPS); |
257 | }; |
258 | |
259 | class SystemGCDCmd : public DCmd { |
260 | public: |
261 | SystemGCDCmd(outputStream* output, bool heap) : DCmd(output, heap) { } |
262 | static const char* name() { return "GC.run" ; } |
263 | static const char* description() { |
264 | return "Call java.lang.System.gc()." ; |
265 | } |
266 | static const char* impact() { |
267 | return "Medium: Depends on Java heap size and content." ; |
268 | } |
269 | static int num_arguments() { return 0; } |
270 | virtual void execute(DCmdSource source, TRAPS); |
271 | }; |
272 | |
273 | class RunFinalizationDCmd : public DCmd { |
274 | public: |
275 | RunFinalizationDCmd(outputStream* output, bool heap) : DCmd(output, heap) { } |
276 | static const char* name() { return "GC.run_finalization" ; } |
277 | static const char* description() { |
278 | return "Call java.lang.System.runFinalization()." ; |
279 | } |
280 | static const char* impact() { |
281 | return "Medium: Depends on Java content." ; |
282 | } |
283 | static int num_arguments() { return 0; } |
284 | virtual void execute(DCmdSource source, TRAPS); |
285 | }; |
286 | |
287 | class HeapInfoDCmd : public DCmd { |
288 | public: |
289 | HeapInfoDCmd(outputStream* output, bool heap) : DCmd(output, heap) { } |
290 | static const char* name() { return "GC.heap_info" ; } |
291 | static const char* description() { |
292 | return "Provide generic Java heap information." ; |
293 | } |
294 | static const char* impact() { |
295 | return "Medium" ; |
296 | } |
297 | static int num_arguments() { return 0; } |
298 | static const JavaPermission permission() { |
299 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
300 | "monitor" , NULL}; |
301 | return p; |
302 | } |
303 | |
304 | virtual void execute(DCmdSource source, TRAPS); |
305 | }; |
306 | |
307 | class FinalizerInfoDCmd : public DCmd { |
308 | public: |
309 | FinalizerInfoDCmd(outputStream* output, bool heap) : DCmd(output, heap) { } |
310 | static const char* name() { return "GC.finalizer_info" ; } |
311 | static const char* description() { |
312 | return "Provide information about Java finalization queue." ; |
313 | } |
314 | static const char* impact() { |
315 | return "Medium" ; |
316 | } |
317 | static int num_arguments() { return 0; } |
318 | static const JavaPermission permission() { |
319 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
320 | "monitor" , NULL}; |
321 | return p; |
322 | } |
323 | |
324 | virtual void execute(DCmdSource source, TRAPS); |
325 | }; |
326 | |
327 | #if INCLUDE_SERVICES // Heap dumping supported |
328 | // See also: dump_heap in attachListener.cpp |
329 | class HeapDumpDCmd : public DCmdWithParser { |
330 | protected: |
331 | DCmdArgument<char*> _filename; |
332 | DCmdArgument<bool> _all; |
333 | public: |
334 | HeapDumpDCmd(outputStream* output, bool heap); |
335 | static const char* name() { |
336 | return "GC.heap_dump" ; |
337 | } |
338 | static const char* description() { |
339 | return "Generate a HPROF format dump of the Java heap." ; |
340 | } |
341 | static const char* impact() { |
342 | return "High: Depends on Java heap size and content. " |
343 | "Request a full GC unless the '-all' option is specified." ; |
344 | } |
345 | static const JavaPermission permission() { |
346 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
347 | "monitor" , NULL}; |
348 | return p; |
349 | } |
350 | static int num_arguments(); |
351 | virtual void execute(DCmdSource source, TRAPS); |
352 | }; |
353 | #endif // INCLUDE_SERVICES |
354 | |
355 | // See also: inspectheap in attachListener.cpp |
356 | class ClassHistogramDCmd : public DCmdWithParser { |
357 | protected: |
358 | DCmdArgument<bool> _all; |
359 | public: |
360 | ClassHistogramDCmd(outputStream* output, bool heap); |
361 | static const char* name() { |
362 | return "GC.class_histogram" ; |
363 | } |
364 | static const char* description() { |
365 | return "Provide statistics about the Java heap usage." ; |
366 | } |
367 | static const char* impact() { |
368 | return "High: Depends on Java heap size and content." ; |
369 | } |
370 | static const JavaPermission permission() { |
371 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
372 | "monitor" , NULL}; |
373 | return p; |
374 | } |
375 | static int num_arguments(); |
376 | virtual void execute(DCmdSource source, TRAPS); |
377 | }; |
378 | |
379 | class ClassStatsDCmd : public DCmdWithParser { |
380 | protected: |
381 | DCmdArgument<bool> _all; |
382 | DCmdArgument<bool> _csv; |
383 | DCmdArgument<bool> _help; |
384 | DCmdArgument<char*> _columns; |
385 | public: |
386 | ClassStatsDCmd(outputStream* output, bool heap); |
387 | static const char* name() { |
388 | return "GC.class_stats" ; |
389 | } |
390 | static const char* description() { |
391 | return "Provide statistics about Java class meta data." ; |
392 | } |
393 | static const char* impact() { |
394 | return "High: Depends on Java heap size and content." ; |
395 | } |
396 | static int num_arguments(); |
397 | virtual void execute(DCmdSource source, TRAPS); |
398 | }; |
399 | |
400 | |
401 | class ClassHierarchyDCmd : public DCmdWithParser { |
402 | protected: |
403 | DCmdArgument<bool> _print_interfaces; // true if inherited interfaces should be printed. |
404 | DCmdArgument<bool> _print_subclasses; // true if subclasses of the specified classname should be printed. |
405 | DCmdArgument<char*> _classname; // Optional single class name whose hierarchy should be printed. |
406 | public: |
407 | ClassHierarchyDCmd(outputStream* output, bool heap); |
408 | static const char* name() { |
409 | return "VM.class_hierarchy" ; |
410 | } |
411 | static const char* description() { |
412 | return "Print a list of all loaded classes, indented to show the class hiearchy. " |
413 | "The name of each class is followed by the ClassLoaderData* of its ClassLoader, " |
414 | "or \"null\" if loaded by the bootstrap class loader." ; |
415 | } |
416 | static const char* impact() { |
417 | return "Medium: Depends on number of loaded classes." ; |
418 | } |
419 | static const JavaPermission permission() { |
420 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
421 | "monitor" , NULL}; |
422 | return p; |
423 | } |
424 | static int num_arguments(); |
425 | virtual void execute(DCmdSource source, TRAPS); |
426 | }; |
427 | |
428 | class TouchedMethodsDCmd : public DCmdWithParser { |
429 | public: |
430 | TouchedMethodsDCmd(outputStream* output, bool heap); |
431 | static const char* name() { |
432 | return "VM.print_touched_methods" ; |
433 | } |
434 | static const char* description() { |
435 | return "Print all methods that have ever been touched during the lifetime of this JVM." ; |
436 | } |
437 | static const char* impact() { |
438 | return "Medium: Depends on Java content." ; |
439 | } |
440 | static int num_arguments(); |
441 | virtual void execute(DCmdSource source, TRAPS); |
442 | }; |
443 | |
444 | // See also: thread_dump in attachListener.cpp |
445 | class ThreadDumpDCmd : public DCmdWithParser { |
446 | protected: |
447 | DCmdArgument<bool> _locks; |
448 | DCmdArgument<bool> _extended; |
449 | public: |
450 | ThreadDumpDCmd(outputStream* output, bool heap); |
451 | static const char* name() { return "Thread.print" ; } |
452 | static const char* description() { |
453 | return "Print all threads with stacktraces." ; |
454 | } |
455 | static const char* impact() { |
456 | return "Medium: Depends on the number of threads." ; |
457 | } |
458 | static const JavaPermission permission() { |
459 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
460 | "monitor" , NULL}; |
461 | return p; |
462 | } |
463 | static int num_arguments(); |
464 | virtual void execute(DCmdSource source, TRAPS); |
465 | }; |
466 | |
467 | // Enhanced JMX Agent support |
468 | |
469 | class JMXStartRemoteDCmd : public DCmdWithParser { |
470 | |
471 | // Explicitly list all properties that could be |
472 | // passed to Agent.startRemoteManagementAgent() |
473 | // com.sun.management is omitted |
474 | |
475 | DCmdArgument<char *> _config_file; |
476 | DCmdArgument<char *> _jmxremote_host; |
477 | DCmdArgument<char *> _jmxremote_port; |
478 | DCmdArgument<char *> _jmxremote_rmi_port; |
479 | DCmdArgument<char *> _jmxremote_ssl; |
480 | DCmdArgument<char *> _jmxremote_registry_ssl; |
481 | DCmdArgument<char *> _jmxremote_authenticate; |
482 | DCmdArgument<char *> _jmxremote_password_file; |
483 | DCmdArgument<char *> _jmxremote_access_file; |
484 | DCmdArgument<char *> _jmxremote_login_config; |
485 | DCmdArgument<char *> _jmxremote_ssl_enabled_cipher_suites; |
486 | DCmdArgument<char *> _jmxremote_ssl_enabled_protocols; |
487 | DCmdArgument<char *> _jmxremote_ssl_need_client_auth; |
488 | DCmdArgument<char *> _jmxremote_ssl_config_file; |
489 | |
490 | // JDP support |
491 | // Keep autodiscovery char* not bool to pass true/false |
492 | // as property value to java level. |
493 | DCmdArgument<char *> _jmxremote_autodiscovery; |
494 | DCmdArgument<jlong> _jdp_port; |
495 | DCmdArgument<char *> _jdp_address; |
496 | DCmdArgument<char *> _jdp_source_addr; |
497 | DCmdArgument<jlong> _jdp_ttl; |
498 | DCmdArgument<jlong> _jdp_pause; |
499 | DCmdArgument<char *> _jdp_name; |
500 | |
501 | public: |
502 | JMXStartRemoteDCmd(outputStream *output, bool heap_allocated); |
503 | |
504 | static const char *name() { |
505 | return "ManagementAgent.start" ; |
506 | } |
507 | |
508 | static const char *description() { |
509 | return "Start remote management agent." ; |
510 | } |
511 | |
512 | static int num_arguments(); |
513 | |
514 | virtual void execute(DCmdSource source, TRAPS); |
515 | |
516 | }; |
517 | |
518 | class JMXStartLocalDCmd : public DCmd { |
519 | |
520 | // Explicitly request start of local agent, |
521 | // it will not be started by start dcmd |
522 | |
523 | |
524 | public: |
525 | JMXStartLocalDCmd(outputStream *output, bool heap_allocated); |
526 | |
527 | static const char *name() { |
528 | return "ManagementAgent.start_local" ; |
529 | } |
530 | |
531 | static const char *description() { |
532 | return "Start local management agent." ; |
533 | } |
534 | |
535 | virtual void execute(DCmdSource source, TRAPS); |
536 | |
537 | }; |
538 | |
539 | class JMXStopRemoteDCmd : public DCmd { |
540 | public: |
541 | JMXStopRemoteDCmd(outputStream *output, bool heap_allocated) : |
542 | DCmd(output, heap_allocated) { |
543 | // Do Nothing |
544 | } |
545 | |
546 | static const char *name() { |
547 | return "ManagementAgent.stop" ; |
548 | } |
549 | |
550 | static const char *description() { |
551 | return "Stop remote management agent." ; |
552 | } |
553 | |
554 | virtual void execute(DCmdSource source, TRAPS); |
555 | }; |
556 | |
557 | // Print the JMX system status |
558 | class JMXStatusDCmd : public DCmd { |
559 | public: |
560 | JMXStatusDCmd(outputStream *output, bool heap_allocated); |
561 | |
562 | static const char *name() { |
563 | return "ManagementAgent.status" ; |
564 | } |
565 | |
566 | static const char *description() { |
567 | return "Print the management agent status." ; |
568 | } |
569 | |
570 | static const JavaPermission permission() { |
571 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
572 | "monitor" , NULL}; |
573 | return p; |
574 | } |
575 | |
576 | virtual void execute(DCmdSource source, TRAPS); |
577 | |
578 | }; |
579 | |
580 | class CompileQueueDCmd : public DCmd { |
581 | public: |
582 | CompileQueueDCmd(outputStream* output, bool heap) : DCmd(output, heap) {} |
583 | static const char* name() { |
584 | return "Compiler.queue" ; |
585 | } |
586 | static const char* description() { |
587 | return "Print methods queued for compilation." ; |
588 | } |
589 | static const char* impact() { |
590 | return "Low" ; |
591 | } |
592 | static const JavaPermission permission() { |
593 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
594 | "monitor" , NULL}; |
595 | return p; |
596 | } |
597 | static int num_arguments() { return 0; } |
598 | virtual void execute(DCmdSource source, TRAPS); |
599 | }; |
600 | |
601 | class CodeListDCmd : public DCmd { |
602 | public: |
603 | CodeListDCmd(outputStream* output, bool heap) : DCmd(output, heap) {} |
604 | static const char* name() { |
605 | return "Compiler.codelist" ; |
606 | } |
607 | static const char* description() { |
608 | return "Print all compiled methods in code cache that are alive" ; |
609 | } |
610 | static const char* impact() { |
611 | return "Medium" ; |
612 | } |
613 | static const JavaPermission permission() { |
614 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
615 | "monitor" , NULL}; |
616 | return p; |
617 | } |
618 | static int num_arguments() { return 0; } |
619 | virtual void execute(DCmdSource source, TRAPS); |
620 | }; |
621 | |
622 | |
623 | class CodeCacheDCmd : public DCmd { |
624 | public: |
625 | CodeCacheDCmd(outputStream* output, bool heap) : DCmd(output, heap) {} |
626 | static const char* name() { |
627 | return "Compiler.codecache" ; |
628 | } |
629 | static const char* description() { |
630 | return "Print code cache layout and bounds." ; |
631 | } |
632 | static const char* impact() { |
633 | return "Low" ; |
634 | } |
635 | static const JavaPermission permission() { |
636 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
637 | "monitor" , NULL}; |
638 | return p; |
639 | } |
640 | static int num_arguments() { return 0; } |
641 | virtual void execute(DCmdSource source, TRAPS); |
642 | }; |
643 | |
644 | //---< BEGIN >--- CodeHeap State Analytics. |
645 | class CodeHeapAnalyticsDCmd : public DCmdWithParser { |
646 | protected: |
647 | DCmdArgument<char*> _function; |
648 | DCmdArgument<jlong> _granularity; |
649 | public: |
650 | CodeHeapAnalyticsDCmd(outputStream* output, bool heap); |
651 | static const char* name() { |
652 | return "Compiler.CodeHeap_Analytics" ; |
653 | } |
654 | static const char* description() { |
655 | return "Print CodeHeap analytics" ; |
656 | } |
657 | static const char* impact() { |
658 | return "Low: Depends on code heap size and content. " |
659 | "Holds CodeCache_lock during analysis step, usually sub-second duration." ; |
660 | } |
661 | static const JavaPermission permission() { |
662 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
663 | "monitor" , NULL}; |
664 | return p; |
665 | } |
666 | static int num_arguments(); |
667 | virtual void execute(DCmdSource source, TRAPS); |
668 | }; |
669 | //---< END >--- CodeHeap State Analytics. |
670 | |
671 | class CompilerDirectivesPrintDCmd : public DCmd { |
672 | public: |
673 | CompilerDirectivesPrintDCmd(outputStream* output, bool heap) : DCmd(output, heap) {} |
674 | static const char* name() { |
675 | return "Compiler.directives_print" ; |
676 | } |
677 | static const char* description() { |
678 | return "Print all active compiler directives." ; |
679 | } |
680 | static const char* impact() { |
681 | return "Low" ; |
682 | } |
683 | static const JavaPermission permission() { |
684 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
685 | "monitor" , NULL}; |
686 | return p; |
687 | } |
688 | static int num_arguments() { return 0; } |
689 | virtual void execute(DCmdSource source, TRAPS); |
690 | }; |
691 | |
692 | class CompilerDirectivesRemoveDCmd : public DCmd { |
693 | public: |
694 | CompilerDirectivesRemoveDCmd(outputStream* output, bool heap) : DCmd(output, heap) {} |
695 | static const char* name() { |
696 | return "Compiler.directives_remove" ; |
697 | } |
698 | static const char* description() { |
699 | return "Remove latest added compiler directive." ; |
700 | } |
701 | static const char* impact() { |
702 | return "Low" ; |
703 | } |
704 | static const JavaPermission permission() { |
705 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
706 | "monitor" , NULL}; |
707 | return p; |
708 | } |
709 | static int num_arguments() { return 0; } |
710 | virtual void execute(DCmdSource source, TRAPS); |
711 | }; |
712 | |
713 | class CompilerDirectivesAddDCmd : public DCmdWithParser { |
714 | protected: |
715 | DCmdArgument<char*> _filename; |
716 | public: |
717 | CompilerDirectivesAddDCmd(outputStream* output, bool heap); |
718 | static const char* name() { |
719 | return "Compiler.directives_add" ; |
720 | } |
721 | static const char* description() { |
722 | return "Add compiler directives from file." ; |
723 | } |
724 | static const char* impact() { |
725 | return "Low" ; |
726 | } |
727 | static const JavaPermission permission() { |
728 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
729 | "monitor" , NULL}; |
730 | return p; |
731 | } |
732 | static int num_arguments(); |
733 | virtual void execute(DCmdSource source, TRAPS); |
734 | }; |
735 | |
736 | class CompilerDirectivesClearDCmd : public DCmd { |
737 | public: |
738 | CompilerDirectivesClearDCmd(outputStream* output, bool heap) : DCmd(output, heap) {} |
739 | static const char* name() { |
740 | return "Compiler.directives_clear" ; |
741 | } |
742 | static const char* description() { |
743 | return "Remove all compiler directives." ; |
744 | } |
745 | static const char* impact() { |
746 | return "Low" ; |
747 | } |
748 | static const JavaPermission permission() { |
749 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
750 | "monitor" , NULL}; |
751 | return p; |
752 | } |
753 | static int num_arguments() { return 0; } |
754 | virtual void execute(DCmdSource source, TRAPS); |
755 | }; |
756 | |
757 | /////////////////////////////////////////////////////////////////////// |
758 | // |
759 | // jcmd command support for symbol table, string table and system dictionary dumping: |
760 | // VM.symboltable -verbose: for dumping the symbol table |
761 | // VM.stringtable -verbose: for dumping the string table |
762 | // VM.systemdictionary -verbose: for dumping the system dictionary table |
763 | // |
764 | class VM_DumpHashtable : public VM_Operation { |
765 | private: |
766 | outputStream* _out; |
767 | int _which; |
768 | bool _verbose; |
769 | public: |
770 | enum { |
771 | DumpSymbols = 1 << 0, |
772 | DumpStrings = 1 << 1, |
773 | DumpSysDict = 1 << 2 // not implemented yet |
774 | }; |
775 | VM_DumpHashtable(outputStream* out, int which, bool verbose) { |
776 | _out = out; |
777 | _which = which; |
778 | _verbose = verbose; |
779 | } |
780 | |
781 | virtual VMOp_Type type() const { return VMOp_DumpHashtable; } |
782 | |
783 | virtual void doit() { |
784 | switch (_which) { |
785 | case DumpSymbols: |
786 | SymbolTable::dump(_out, _verbose); |
787 | break; |
788 | case DumpStrings: |
789 | StringTable::dump(_out, _verbose); |
790 | break; |
791 | case DumpSysDict: |
792 | SystemDictionary::dump(_out, _verbose); |
793 | break; |
794 | default: |
795 | ShouldNotReachHere(); |
796 | } |
797 | } |
798 | }; |
799 | |
800 | class SymboltableDCmd : public DCmdWithParser { |
801 | protected: |
802 | DCmdArgument<bool> _verbose; |
803 | public: |
804 | SymboltableDCmd(outputStream* output, bool heap); |
805 | static const char* name() { |
806 | return "VM.symboltable" ; |
807 | } |
808 | static const char* description() { |
809 | return "Dump symbol table." ; |
810 | } |
811 | static const char* impact() { |
812 | return "Medium: Depends on Java content." ; |
813 | } |
814 | static const JavaPermission permission() { |
815 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
816 | "monitor" , NULL}; |
817 | return p; |
818 | } |
819 | static int num_arguments(); |
820 | virtual void execute(DCmdSource source, TRAPS); |
821 | }; |
822 | |
823 | class StringtableDCmd : public DCmdWithParser { |
824 | protected: |
825 | DCmdArgument<bool> _verbose; |
826 | public: |
827 | StringtableDCmd(outputStream* output, bool heap); |
828 | static const char* name() { |
829 | return "VM.stringtable" ; |
830 | } |
831 | static const char* description() { |
832 | return "Dump string table." ; |
833 | } |
834 | static const char* impact() { |
835 | return "Medium: Depends on Java content." ; |
836 | } |
837 | static const JavaPermission permission() { |
838 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
839 | "monitor" , NULL}; |
840 | return p; |
841 | } |
842 | static int num_arguments(); |
843 | virtual void execute(DCmdSource source, TRAPS); |
844 | }; |
845 | |
846 | class SystemDictionaryDCmd : public DCmdWithParser { |
847 | protected: |
848 | DCmdArgument<bool> _verbose; |
849 | public: |
850 | SystemDictionaryDCmd(outputStream* output, bool heap); |
851 | static const char* name() { |
852 | return "VM.systemdictionary" ; |
853 | } |
854 | static const char* description() { |
855 | return "Prints the statistics for dictionary hashtable sizes and bucket length" ; |
856 | } |
857 | static const char* impact() { |
858 | return "Medium: Depends on Java content." ; |
859 | } |
860 | static const JavaPermission permission() { |
861 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
862 | "monitor" , NULL}; |
863 | return p; |
864 | } |
865 | static int num_arguments(); |
866 | virtual void execute(DCmdSource source, TRAPS); |
867 | }; |
868 | |
869 | #if INCLUDE_JVMTI |
870 | class DebugOnCmdStartDCmd : public DCmdWithParser { |
871 | public: |
872 | DebugOnCmdStartDCmd(outputStream* output, bool heap); |
873 | static const char* name() { |
874 | return "VM.start_java_debugging" ; |
875 | } |
876 | static const char* description() { |
877 | return "Starts up the Java debugging if the jdwp agentlib was enabled with the option onjcmd=y." ; |
878 | } |
879 | static const char* impact() { |
880 | return "High: Switches the VM into Java debug mode." ; |
881 | } |
882 | static const JavaPermission permission() { |
883 | JavaPermission p = { "java.lang.management.ManagementPermission" , "control" , NULL }; |
884 | return p; |
885 | } |
886 | static int num_arguments() { return 0; } |
887 | virtual void execute(DCmdSource source, TRAPS); |
888 | }; |
889 | #endif // INCLUDE_JVMTI |
890 | |
891 | class EventLogDCmd : public DCmdWithParser { |
892 | protected: |
893 | DCmdArgument<char*> _log; |
894 | DCmdArgument<char*> _max; |
895 | public: |
896 | EventLogDCmd(outputStream* output, bool heap); |
897 | static const char* name() { |
898 | return "VM.events" ; |
899 | } |
900 | static const char* description() { |
901 | return "Print VM event logs" ; |
902 | } |
903 | static const char* impact() { |
904 | return "Low: Depends on event log size. " ; |
905 | } |
906 | static const JavaPermission permission() { |
907 | JavaPermission p = {"java.lang.management.ManagementPermission" , |
908 | "monitor" , NULL}; |
909 | return p; |
910 | } |
911 | static int num_arguments(); |
912 | virtual void execute(DCmdSource source, TRAPS); |
913 | }; |
914 | |
915 | #endif // SHARE_SERVICES_DIAGNOSTICCOMMAND_HPP |
916 | |