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; | 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 PrintClassLayoutDCmd : public DCmdWithParser { 429 protected: 430 DCmdArgument<char*> _classname; // lass name whose layout should be printed. 431 public: 432 PrintClassLayoutDCmd(outputStream* output, bool heap); 433 static const char* name() { 434 return "VM.class_print_layout"; 435 } 436 static const char* description() { 437 return "Print the layout of an instance of a class, including flattened fields. " 438 "The name of each class is followed by the ClassLoaderData* of its ClassLoader, " 439 "or \"null\" if loaded by the bootstrap class loader."; 440 } 441 static const char* impact() { 442 return "Medium: Depends on number of loaded classes."; 443 } 444 static const JavaPermission permission() { 445 JavaPermission p = {"java.lang.management.ManagementPermission", 446 "monitor", NULL}; 447 return p; 448 } 449 static int num_arguments(); 450 virtual void execute(DCmdSource source, TRAPS); 451 }; 452 453 454 class TouchedMethodsDCmd : public DCmdWithParser { 455 public: 456 TouchedMethodsDCmd(outputStream* output, bool heap); 457 static const char* name() { 458 return "VM.print_touched_methods"; 459 } 460 static const char* description() { 461 return "Print all methods that have ever been touched during the lifetime of this JVM."; 462 } 463 static const char* impact() { 464 return "Medium: Depends on Java content."; 465 } 466 static int num_arguments(); 467 virtual void execute(DCmdSource source, TRAPS); 468 }; 469 470 // See also: thread_dump in attachListener.cpp 471 class ThreadDumpDCmd : public DCmdWithParser { 472 protected: 473 DCmdArgument<bool> _locks; |