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