448 while (indent != 0) { 449 st->print("|"); 450 indent--; 451 if (indent != 0) { 452 st->print(" "); 453 } 454 } 455 } 456 457 // Print the class name and its unique ClassLoader identifer. 458 static void print_classname(outputStream* st, Klass* klass) { 459 oop loader_oop = klass->class_loader_data()->class_loader(); 460 st->print("%s/", klass->external_name()); 461 if (loader_oop == NULL) { 462 st->print("null"); 463 } else { 464 st->print(INTPTR_FORMAT, p2i(klass->class_loader_data())); 465 } 466 } 467 468 static void print_interface(outputStream* st, Klass* intf_klass, const char* intf_type, int indent) { 469 print_indent(st, indent); 470 st->print(" implements "); 471 print_classname(st, intf_klass); 472 st->print(" (%s intf)\n", intf_type); 473 } 474 475 void KlassHierarchy::print_class(outputStream* st, KlassInfoEntry* cie, bool print_interfaces) { 476 ResourceMark rm; 477 InstanceKlass* klass = (InstanceKlass*)cie->klass(); 478 int indent = 0; 479 480 // Print indentation with proper indicators of superclass. 481 Klass* super = klass->super(); 482 while (super != NULL) { 483 super = super->super(); 484 indent++; 485 } 486 print_indent(st, indent); 487 if (indent != 0) st->print("--"); 488 489 // Print the class name, its unique ClassLoader identifer, and if it is an interface. 490 print_classname(st, klass); 491 if (klass->is_interface()) { 492 st->print(" (intf)"); 493 } 494 // Special treatment for generated core reflection accessor classes: print invocation target. 495 if (ReflectionAccessorImplKlassHelper::is_generated_accessor(klass)) { 496 st->print(" (invokes: "); 497 ReflectionAccessorImplKlassHelper::print_invocation_target(st, klass); 498 st->print(")"); 499 } 500 st->print("\n"); 501 502 // Print any interfaces the class has. 503 if (print_interfaces) { 504 Array<Klass*>* local_intfs = klass->local_interfaces(); 505 Array<Klass*>* trans_intfs = klass->transitive_interfaces(); 506 for (int i = 0; i < local_intfs->length(); i++) { 507 print_interface(st, local_intfs->at(i), "declared", indent); 508 } 509 for (int i = 0; i < trans_intfs->length(); i++) { 510 Klass* trans_interface = trans_intfs->at(i); 511 // Only print transitive interfaces if they are not also declared. 512 if (!local_intfs->contains(trans_interface)) { 513 print_interface(st, trans_interface, "inherited", indent); 514 } 515 } 516 } 517 } 518 519 void KlassInfoHisto::print_class_stats(outputStream* st, 520 bool csv_format, const char *columns) { 521 ResourceMark rm; 522 KlassSizeStats sz, sz_sum; 523 int i; 524 julong *col_table = (julong*)(&sz); 525 julong *colsum_table = (julong*)(&sz_sum); 526 int width_table[KlassSizeStats::_num_columns]; 527 bool selected[KlassSizeStats::_num_columns]; 528 529 _selected_columns = columns; 530 | 448 while (indent != 0) { 449 st->print("|"); 450 indent--; 451 if (indent != 0) { 452 st->print(" "); 453 } 454 } 455 } 456 457 // Print the class name and its unique ClassLoader identifer. 458 static void print_classname(outputStream* st, Klass* klass) { 459 oop loader_oop = klass->class_loader_data()->class_loader(); 460 st->print("%s/", klass->external_name()); 461 if (loader_oop == NULL) { 462 st->print("null"); 463 } else { 464 st->print(INTPTR_FORMAT, p2i(klass->class_loader_data())); 465 } 466 } 467 468 static void print_interface(outputStream* st, InstanceKlass* intf_klass, const char* intf_type, int indent) { 469 print_indent(st, indent); 470 st->print(" implements "); 471 print_classname(st, intf_klass); 472 st->print(" (%s intf)\n", intf_type); 473 } 474 475 void KlassHierarchy::print_class(outputStream* st, KlassInfoEntry* cie, bool print_interfaces) { 476 ResourceMark rm; 477 InstanceKlass* klass = (InstanceKlass*)cie->klass(); 478 int indent = 0; 479 480 // Print indentation with proper indicators of superclass. 481 Klass* super = klass->super(); 482 while (super != NULL) { 483 super = super->super(); 484 indent++; 485 } 486 print_indent(st, indent); 487 if (indent != 0) st->print("--"); 488 489 // Print the class name, its unique ClassLoader identifer, and if it is an interface. 490 print_classname(st, klass); 491 if (klass->is_interface()) { 492 st->print(" (intf)"); 493 } 494 // Special treatment for generated core reflection accessor classes: print invocation target. 495 if (ReflectionAccessorImplKlassHelper::is_generated_accessor(klass)) { 496 st->print(" (invokes: "); 497 ReflectionAccessorImplKlassHelper::print_invocation_target(st, klass); 498 st->print(")"); 499 } 500 st->print("\n"); 501 502 // Print any interfaces the class has. 503 if (print_interfaces) { 504 Array<InstanceKlass*>* local_intfs = klass->local_interfaces(); 505 Array<InstanceKlass*>* trans_intfs = klass->transitive_interfaces(); 506 for (int i = 0; i < local_intfs->length(); i++) { 507 print_interface(st, local_intfs->at(i), "declared", indent); 508 } 509 for (int i = 0; i < trans_intfs->length(); i++) { 510 InstanceKlass* trans_interface = trans_intfs->at(i); 511 // Only print transitive interfaces if they are not also declared. 512 if (!local_intfs->contains(trans_interface)) { 513 print_interface(st, trans_interface, "inherited", indent); 514 } 515 } 516 } 517 } 518 519 void KlassInfoHisto::print_class_stats(outputStream* st, 520 bool csv_format, const char *columns) { 521 ResourceMark rm; 522 KlassSizeStats sz, sz_sum; 523 int i; 524 julong *col_table = (julong*)(&sz); 525 julong *colsum_table = (julong*)(&sz_sum); 526 int width_table[KlassSizeStats::_num_columns]; 527 bool selected[KlassSizeStats::_num_columns]; 528 529 _selected_columns = columns; 530 |