1 /*
   2  * Copyright (c) 2002, 2018, 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 #include "precompiled.hpp"
  26 #include "classfile/classLoaderData.inline.hpp"
  27 #include "classfile/moduleEntry.hpp"
  28 #include "classfile/systemDictionary.hpp"
  29 #include "gc/shared/collectedHeap.hpp"
  30 #include "memory/heapInspection.hpp"
  31 #include "memory/resourceArea.hpp"
  32 #include "oops/oop.inline.hpp"
  33 #include "oops/reflectionAccessorImplKlassHelper.hpp"
  34 #include "runtime/os.hpp"
  35 #include "utilities/globalDefinitions.hpp"
  36 #include "utilities/macros.hpp"
  37 #include "utilities/stack.inline.hpp"
  38 
  39 // HeapInspection
  40 
  41 int KlassSizeStats::count(oop x) {
  42   return (HeapWordSize * (((x) != NULL) ? (x)->size() : 0));
  43 }
  44 
  45 int KlassSizeStats::count_array(objArrayOop x) {
  46   return (HeapWordSize * (((x) != NULL) ? (x)->size() : 0));
  47 }
  48 
  49 inline KlassInfoEntry::~KlassInfoEntry() {
  50   if (_subclasses != NULL) {
  51     delete _subclasses;
  52   }
  53 }
  54 
  55 inline void KlassInfoEntry::add_subclass(KlassInfoEntry* cie) {
  56   if (_subclasses == NULL) {
  57     _subclasses = new  (ResourceObj::C_HEAP, mtInternal) GrowableArray<KlassInfoEntry*>(4, true);
  58   }
  59   _subclasses->append(cie);
  60 }
  61 
  62 int KlassInfoEntry::compare(KlassInfoEntry* e1, KlassInfoEntry* e2) {
  63   if(e1->_instance_words > e2->_instance_words) {
  64     return -1;
  65   } else if(e1->_instance_words < e2->_instance_words) {
  66     return 1;
  67   }
  68   // Sort alphabetically, note 'Z' < '[' < 'a', but it's better to group
  69   // the array classes before all the instance classes.
  70   ResourceMark rm;
  71   const char* name1 = e1->klass()->external_name();
  72   const char* name2 = e2->klass()->external_name();
  73   bool d1 = (name1[0] == '[');
  74   bool d2 = (name2[0] == '[');
  75   if (d1 && !d2) {
  76     return -1;
  77   } else if (d2 && !d1) {
  78     return 1;
  79   } else {
  80     return strcmp(name1, name2);
  81   }
  82 }
  83 
  84 const char* KlassInfoEntry::name() const {
  85   const char* name;
  86   if (_klass->name() != NULL) {
  87     name = _klass->external_name();
  88   } else {
  89     if (_klass == Universe::boolArrayKlassObj())         name = "<boolArrayKlass>";         else
  90     if (_klass == Universe::charArrayKlassObj())         name = "<charArrayKlass>";         else
  91     if (_klass == Universe::singleArrayKlassObj())       name = "<singleArrayKlass>";       else
  92     if (_klass == Universe::doubleArrayKlassObj())       name = "<doubleArrayKlass>";       else
  93     if (_klass == Universe::byteArrayKlassObj())         name = "<byteArrayKlass>";         else
  94     if (_klass == Universe::shortArrayKlassObj())        name = "<shortArrayKlass>";        else
  95     if (_klass == Universe::intArrayKlassObj())          name = "<intArrayKlass>";          else
  96     if (_klass == Universe::longArrayKlassObj())         name = "<longArrayKlass>";         else
  97       name = "<no name>";
  98   }
  99   return name;
 100 }
 101 
 102 void KlassInfoEntry::print_on(outputStream* st) const {
 103   ResourceMark rm;
 104 
 105   // simplify the formatting (ILP32 vs LP64) - always cast the numbers to 64-bit
 106   ModuleEntry* module = _klass->module();
 107   if (module->is_named()) {
 108     st->print_cr(INT64_FORMAT_W(13) "  " UINT64_FORMAT_W(13) "  %s (%s@%s)",
 109                  (int64_t)_instance_count,
 110                  (uint64_t)_instance_words * HeapWordSize,
 111                  name(),
 112                  module->name()->as_C_string(),
 113                  module->version() != NULL ? module->version()->as_C_string() : "");
 114   } else {
 115     st->print_cr(INT64_FORMAT_W(13) "  " UINT64_FORMAT_W(13) "  %s",
 116                  (int64_t)_instance_count,
 117                  (uint64_t)_instance_words * HeapWordSize,
 118                  name());
 119   }
 120 }
 121 
 122 KlassInfoEntry* KlassInfoBucket::lookup(Klass* const k) {
 123   KlassInfoEntry* elt = _list;
 124   while (elt != NULL) {
 125     if (elt->is_equal(k)) {
 126       return elt;
 127     }
 128     elt = elt->next();
 129   }
 130   elt = new (std::nothrow) KlassInfoEntry(k, list());
 131   // We may be out of space to allocate the new entry.
 132   if (elt != NULL) {
 133     set_list(elt);
 134   }
 135   return elt;
 136 }
 137 
 138 void KlassInfoBucket::iterate(KlassInfoClosure* cic) {
 139   KlassInfoEntry* elt = _list;
 140   while (elt != NULL) {
 141     cic->do_cinfo(elt);
 142     elt = elt->next();
 143   }
 144 }
 145 
 146 void KlassInfoBucket::empty() {
 147   KlassInfoEntry* elt = _list;
 148   _list = NULL;
 149   while (elt != NULL) {
 150     KlassInfoEntry* next = elt->next();
 151     delete elt;
 152     elt = next;
 153   }
 154 }
 155 
 156 void KlassInfoTable::AllClassesFinder::do_klass(Klass* k) {
 157   // This has the SIDE EFFECT of creating a KlassInfoEntry
 158   // for <k>, if one doesn't exist yet.
 159   _table->lookup(k);
 160 }
 161 
 162 KlassInfoTable::KlassInfoTable(bool add_all_classes) {
 163   _size_of_instances_in_words = 0;
 164   _size = 0;
 165   _ref = (HeapWord*) Universe::boolArrayKlassObj();
 166   _buckets =
 167     (KlassInfoBucket*)  AllocateHeap(sizeof(KlassInfoBucket) * _num_buckets,
 168        mtInternal, CURRENT_PC, AllocFailStrategy::RETURN_NULL);
 169   if (_buckets != NULL) {
 170     _size = _num_buckets;
 171     for (int index = 0; index < _size; index++) {
 172       _buckets[index].initialize();
 173     }
 174     if (add_all_classes) {
 175       AllClassesFinder finder(this);
 176       ClassLoaderDataGraph::classes_do(&finder);
 177     }
 178   }
 179 }
 180 
 181 KlassInfoTable::~KlassInfoTable() {
 182   if (_buckets != NULL) {
 183     for (int index = 0; index < _size; index++) {
 184       _buckets[index].empty();
 185     }
 186     FREE_C_HEAP_ARRAY(KlassInfoBucket, _buckets);
 187     _size = 0;
 188   }
 189 }
 190 
 191 uint KlassInfoTable::hash(const Klass* p) {
 192   return (uint)(((uintptr_t)p - (uintptr_t)_ref) >> 2);
 193 }
 194 
 195 KlassInfoEntry* KlassInfoTable::lookup(Klass* k) {
 196   uint         idx = hash(k) % _size;
 197   assert(_buckets != NULL, "Allocation failure should have been caught");
 198   KlassInfoEntry*  e   = _buckets[idx].lookup(k);
 199   // Lookup may fail if this is a new klass for which we
 200   // could not allocate space for an new entry.
 201   assert(e == NULL || k == e->klass(), "must be equal");
 202   return e;
 203 }
 204 
 205 // Return false if the entry could not be recorded on account
 206 // of running out of space required to create a new entry.
 207 bool KlassInfoTable::record_instance(const oop obj) {
 208   Klass*        k = obj->klass();
 209   KlassInfoEntry* elt = lookup(k);
 210   // elt may be NULL if it's a new klass for which we
 211   // could not allocate space for a new entry in the hashtable.
 212   if (elt != NULL) {
 213     elt->set_count(elt->count() + 1);
 214     elt->set_words(elt->words() + obj->size());
 215     _size_of_instances_in_words += obj->size();
 216     return true;
 217   } else {
 218     return false;
 219   }
 220 }
 221 
 222 void KlassInfoTable::iterate(KlassInfoClosure* cic) {
 223   assert(_size == 0 || _buckets != NULL, "Allocation failure should have been caught");
 224   for (int index = 0; index < _size; index++) {
 225     _buckets[index].iterate(cic);
 226   }
 227 }
 228 
 229 size_t KlassInfoTable::size_of_instances_in_words() const {
 230   return _size_of_instances_in_words;
 231 }
 232 
 233 int KlassInfoHisto::sort_helper(KlassInfoEntry** e1, KlassInfoEntry** e2) {
 234   return (*e1)->compare(*e1,*e2);
 235 }
 236 
 237 KlassInfoHisto::KlassInfoHisto(KlassInfoTable* cit) :
 238   _cit(cit) {
 239   _elements = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<KlassInfoEntry*>(_histo_initial_size, true);
 240 }
 241 
 242 KlassInfoHisto::~KlassInfoHisto() {
 243   delete _elements;
 244 }
 245 
 246 void KlassInfoHisto::add(KlassInfoEntry* cie) {
 247   elements()->append(cie);
 248 }
 249 
 250 void KlassInfoHisto::sort() {
 251   elements()->sort(KlassInfoHisto::sort_helper);
 252 }
 253 
 254 void KlassInfoHisto::print_elements(outputStream* st) const {
 255   // simplify the formatting (ILP32 vs LP64) - store the sum in 64-bit
 256   int64_t total = 0;
 257   uint64_t totalw = 0;
 258   for(int i=0; i < elements()->length(); i++) {
 259     st->print("%4d: ", i+1);
 260     elements()->at(i)->print_on(st);
 261     total += elements()->at(i)->count();
 262     totalw += elements()->at(i)->words();
 263   }
 264   st->print_cr("Total " INT64_FORMAT_W(13) "  " UINT64_FORMAT_W(13),
 265                total, totalw * HeapWordSize);
 266 }
 267 
 268 #define MAKE_COL_NAME(field, name, help)     #name,
 269 #define MAKE_COL_HELP(field, name, help)     help,
 270 
 271 static const char *name_table[] = {
 272   HEAP_INSPECTION_COLUMNS_DO(MAKE_COL_NAME)
 273 };
 274 
 275 static const char *help_table[] = {
 276   HEAP_INSPECTION_COLUMNS_DO(MAKE_COL_HELP)
 277 };
 278 
 279 bool KlassInfoHisto::is_selected(const char *col_name) {
 280   if (_selected_columns == NULL) {
 281     return true;
 282   }
 283   if (strcmp(_selected_columns, col_name) == 0) {
 284     return true;
 285   }
 286 
 287   const char *start = strstr(_selected_columns, col_name);
 288   if (start == NULL) {
 289     return false;
 290   }
 291 
 292   // The following must be true, because _selected_columns != col_name
 293   if (start > _selected_columns && start[-1] != ',') {
 294     return false;
 295   }
 296   char x = start[strlen(col_name)];
 297   if (x != ',' && x != '\0') {
 298     return false;
 299   }
 300 
 301   return true;
 302 }
 303 
 304 void KlassInfoHisto::print_title(outputStream* st, bool csv_format,
 305                                  bool selected[], int width_table[],
 306                                  const char *name_table[]) {
 307   if (csv_format) {
 308     st->print("Index,Super");
 309     for (int c=0; c<KlassSizeStats::_num_columns; c++) {
 310        if (selected[c]) {st->print(",%s", name_table[c]);}
 311     }
 312     st->print(",ClassName");
 313   } else {
 314     st->print("Index Super");
 315     for (int c = 0; c < KlassSizeStats::_num_columns; c++) {
 316       if (selected[c]) {
 317         st->print("%*s", width_table[c], name_table[c]);
 318       }
 319     }
 320     st->print(" ClassName");
 321   }
 322 
 323   if (is_selected("ClassLoader")) {
 324     st->print(",ClassLoader");
 325   }
 326   st->cr();
 327 }
 328 
 329 class HierarchyClosure : public KlassInfoClosure {
 330 private:
 331   GrowableArray<KlassInfoEntry*> *_elements;
 332 public:
 333   HierarchyClosure(GrowableArray<KlassInfoEntry*> *_elements) : _elements(_elements) {}
 334 
 335   void do_cinfo(KlassInfoEntry* cie) {
 336     // ignore array classes
 337     if (cie->klass()->is_instance_klass()) {
 338       _elements->append(cie);
 339     }
 340   }
 341 };
 342 
 343 void KlassHierarchy::print_class_hierarchy(outputStream* st, bool print_interfaces,
 344                                            bool print_subclasses, char* classname) {
 345   ResourceMark rm;
 346   Stack <KlassInfoEntry*, mtClass> class_stack;
 347   GrowableArray<KlassInfoEntry*> elements;
 348 
 349   // Add all classes to the KlassInfoTable, which allows for quick lookup.
 350   // A KlassInfoEntry will be created for each class.
 351   KlassInfoTable cit(true);
 352   if (cit.allocation_failed()) {
 353     st->print_cr("ERROR: Ran out of C-heap; hierarchy not generated");
 354     return;
 355   }
 356 
 357   // Add all created KlassInfoEntry instances to the elements array for easy
 358   // iteration, and to allow each KlassInfoEntry instance to have a unique index.
 359   HierarchyClosure hc(&elements);
 360   cit.iterate(&hc);
 361 
 362   for(int i = 0; i < elements.length(); i++) {
 363     KlassInfoEntry* cie = elements.at(i);
 364     Klass* super = cie->klass()->super();
 365 
 366     // Set the index for the class.
 367     cie->set_index(i + 1);
 368 
 369     // Add the class to the subclass array of its superclass.
 370     if (super != NULL) {
 371       KlassInfoEntry* super_cie = cit.lookup(super);
 372       assert(super_cie != NULL, "could not lookup superclass");
 373       super_cie->add_subclass(cie);
 374     }
 375   }
 376 
 377   // Set the do_print flag for each class that should be printed.
 378   for(int i = 0; i < elements.length(); i++) {
 379     KlassInfoEntry* cie = elements.at(i);
 380     if (classname == NULL) {
 381       // We are printing all classes.
 382       cie->set_do_print(true);
 383     } else {
 384       // We are only printing the hierarchy of a specific class.
 385       if (strcmp(classname, cie->klass()->external_name()) == 0) {
 386         KlassHierarchy::set_do_print_for_class_hierarchy(cie, &cit, print_subclasses);
 387       }
 388     }
 389   }
 390 
 391   // Now we do a depth first traversal of the class hierachry. The class_stack will
 392   // maintain the list of classes we still need to process. Start things off
 393   // by priming it with java.lang.Object.
 394   KlassInfoEntry* jlo_cie = cit.lookup(SystemDictionary::Object_klass());
 395   assert(jlo_cie != NULL, "could not lookup java.lang.Object");
 396   class_stack.push(jlo_cie);
 397 
 398   // Repeatedly pop the top item off the stack, print its class info,
 399   // and push all of its subclasses on to the stack. Do this until there
 400   // are no classes left on the stack.
 401   while (!class_stack.is_empty()) {
 402     KlassInfoEntry* curr_cie = class_stack.pop();
 403     if (curr_cie->do_print()) {
 404       print_class(st, curr_cie, print_interfaces);
 405       if (curr_cie->subclasses() != NULL) {
 406         // Current class has subclasses, so push all of them onto the stack.
 407         for (int i = 0; i < curr_cie->subclasses()->length(); i++) {
 408           KlassInfoEntry* cie = curr_cie->subclasses()->at(i);
 409           if (cie->do_print()) {
 410             class_stack.push(cie);
 411           }
 412         }
 413       }
 414     }
 415   }
 416 
 417   st->flush();
 418 }
 419 
 420 // Sets the do_print flag for every superclass and subclass of the specified class.
 421 void KlassHierarchy::set_do_print_for_class_hierarchy(KlassInfoEntry* cie, KlassInfoTable* cit,
 422                                                       bool print_subclasses) {
 423   // Set do_print for all superclasses of this class.
 424   Klass* super = ((InstanceKlass*)cie->klass())->java_super();
 425   while (super != NULL) {
 426     KlassInfoEntry* super_cie = cit->lookup(super);
 427     super_cie->set_do_print(true);
 428     super = super->super();
 429   }
 430 
 431   // Set do_print for this class and all of its subclasses.
 432   Stack <KlassInfoEntry*, mtClass> class_stack;
 433   class_stack.push(cie);
 434   while (!class_stack.is_empty()) {
 435     KlassInfoEntry* curr_cie = class_stack.pop();
 436     curr_cie->set_do_print(true);
 437     if (print_subclasses && curr_cie->subclasses() != NULL) {
 438       // Current class has subclasses, so push all of them onto the stack.
 439       for (int i = 0; i < curr_cie->subclasses()->length(); i++) {
 440         KlassInfoEntry* cie = curr_cie->subclasses()->at(i);
 441         class_stack.push(cie);
 442       }
 443     }
 444   }
 445 }
 446 
 447 static void print_indent(outputStream* st, int indent) {
 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 
 531   memset(&sz_sum, 0, sizeof(sz_sum));
 532   for (int c=0; c<KlassSizeStats::_num_columns; c++) {
 533     selected[c] = is_selected(name_table[c]);
 534   }
 535 
 536   for(i=0; i < elements()->length(); i++) {
 537     elements()->at(i)->set_index(i+1);
 538   }
 539 
 540   // First iteration is for accumulating stats totals in colsum_table[].
 541   // Second iteration is for printing stats for each class.
 542   for (int pass=1; pass<=2; pass++) {
 543     if (pass == 2) {
 544       print_title(st, csv_format, selected, width_table, name_table);
 545     }
 546     for(i=0; i < elements()->length(); i++) {
 547       KlassInfoEntry* e = (KlassInfoEntry*)elements()->at(i);
 548       const Klass* k = e->klass();
 549 
 550       // Get the stats for this class.
 551       memset(&sz, 0, sizeof(sz));
 552       sz._inst_count = e->count();
 553       sz._inst_bytes = HeapWordSize * e->words();
 554       k->collect_statistics(&sz);
 555       sz._total_bytes = sz._ro_bytes + sz._rw_bytes;
 556 
 557       if (pass == 1) {
 558         // Add the stats for this class to the overall totals.
 559         for (int c=0; c<KlassSizeStats::_num_columns; c++) {
 560           colsum_table[c] += col_table[c];
 561         }
 562       } else {
 563         int super_index = -1;
 564         // Print the stats for this class.
 565         if (k->is_instance_klass()) {
 566           Klass* super = k->super();
 567           if (super) {
 568             KlassInfoEntry* super_e = _cit->lookup(super);
 569             if (super_e) {
 570               super_index = super_e->index();
 571             }
 572           }
 573         }
 574 
 575         if (csv_format) {
 576           st->print("%ld,%d", e->index(), super_index);
 577           for (int c=0; c<KlassSizeStats::_num_columns; c++) {
 578             if (selected[c]) {st->print("," JULONG_FORMAT, col_table[c]);}
 579           }
 580           st->print(",%s",e->name());
 581         } else {
 582           st->print("%5ld %5d", e->index(), super_index);
 583           for (int c=0; c<KlassSizeStats::_num_columns; c++) {
 584             if (selected[c]) {print_julong(st, width_table[c], col_table[c]);}
 585           }
 586           st->print(" %s", e->name());
 587         }
 588         if (is_selected("ClassLoader")) {
 589           ClassLoaderData* loader_data = k->class_loader_data();
 590           st->print(",");
 591           loader_data->print_value_on(st);
 592         }
 593         st->cr();
 594       }
 595     }
 596 
 597     if (pass == 1) {
 598       // Calculate the minimum width needed for the column by accounting for the
 599       // column header width and the width of the largest value in the column.
 600       for (int c=0; c<KlassSizeStats::_num_columns; c++) {
 601         width_table[c] = col_width(colsum_table[c], name_table[c]);
 602       }
 603     }
 604   }
 605 
 606   sz_sum._inst_size = 0;
 607 
 608   // Print the column totals.
 609   if (csv_format) {
 610     st->print(",");
 611     for (int c=0; c<KlassSizeStats::_num_columns; c++) {
 612       if (selected[c]) {st->print("," JULONG_FORMAT, colsum_table[c]);}
 613     }
 614   } else {
 615     st->print("           ");
 616     for (int c=0; c<KlassSizeStats::_num_columns; c++) {
 617       if (selected[c]) {print_julong(st, width_table[c], colsum_table[c]);}
 618     }
 619     st->print(" Total");
 620     if (sz_sum._total_bytes > 0) {
 621       st->cr();
 622       st->print("           ");
 623       for (int c=0; c<KlassSizeStats::_num_columns; c++) {
 624         if (selected[c]) {
 625           switch (c) {
 626           case KlassSizeStats::_index_inst_size:
 627           case KlassSizeStats::_index_inst_count:
 628           case KlassSizeStats::_index_method_count:
 629             st->print("%*s", width_table[c], "-");
 630             break;
 631           default:
 632             {
 633               double perc = (double)(100) * (double)(colsum_table[c]) / (double)sz_sum._total_bytes;
 634               st->print("%*.1f%%", width_table[c]-1, perc);
 635             }
 636           }
 637         }
 638       }
 639     }
 640   }
 641   st->cr();
 642 
 643   if (!csv_format) {
 644     print_title(st, csv_format, selected, width_table, name_table);
 645   }
 646 }
 647 
 648 julong KlassInfoHisto::annotations_bytes(Array<AnnotationArray*>* p) const {
 649   julong bytes = 0;
 650   if (p != NULL) {
 651     for (int i = 0; i < p->length(); i++) {
 652       bytes += count_bytes_array(p->at(i));
 653     }
 654     bytes += count_bytes_array(p);
 655   }
 656   return bytes;
 657 }
 658 
 659 void KlassInfoHisto::print_histo_on(outputStream* st, bool print_stats,
 660                                     bool csv_format, const char *columns) {
 661   if (print_stats) {
 662     print_class_stats(st, csv_format, columns);
 663   } else {
 664     st->print_cr(" num     #instances         #bytes  class name (module)");
 665     st->print_cr("-------------------------------------------------------");
 666     print_elements(st);
 667   }
 668 }
 669 
 670 class HistoClosure : public KlassInfoClosure {
 671  private:
 672   KlassInfoHisto* _cih;
 673  public:
 674   HistoClosure(KlassInfoHisto* cih) : _cih(cih) {}
 675 
 676   void do_cinfo(KlassInfoEntry* cie) {
 677     _cih->add(cie);
 678   }
 679 };
 680 
 681 class RecordInstanceClosure : public ObjectClosure {
 682  private:
 683   KlassInfoTable* _cit;
 684   size_t _missed_count;
 685   BoolObjectClosure* _filter;
 686  public:
 687   RecordInstanceClosure(KlassInfoTable* cit, BoolObjectClosure* filter) :
 688     _cit(cit), _missed_count(0), _filter(filter) {}
 689 
 690   void do_object(oop obj) {
 691     if (should_visit(obj)) {
 692       if (!_cit->record_instance(obj)) {
 693         _missed_count++;
 694       }
 695     }
 696   }
 697 
 698   size_t missed_count() { return _missed_count; }
 699 
 700  private:
 701   bool should_visit(oop obj) {
 702     return _filter == NULL || _filter->do_object_b(obj);
 703   }
 704 };
 705 
 706 size_t HeapInspection::populate_table(KlassInfoTable* cit, BoolObjectClosure *filter) {
 707   ResourceMark rm;
 708 
 709   RecordInstanceClosure ric(cit, filter);
 710   Universe::heap()->object_iterate(&ric);
 711   return ric.missed_count();
 712 }
 713 
 714 void HeapInspection::heap_inspection(outputStream* st) {
 715   ResourceMark rm;
 716 
 717   if (_print_help) {
 718     for (int c=0; c<KlassSizeStats::_num_columns; c++) {
 719       st->print("%s:\n\t", name_table[c]);
 720       const int max_col = 60;
 721       int col = 0;
 722       for (const char *p = help_table[c]; *p; p++,col++) {
 723         if (col >= max_col && *p == ' ') {
 724           st->print("\n\t");
 725           col = 0;
 726         } else {
 727           st->print("%c", *p);
 728         }
 729       }
 730       st->print_cr(".\n");
 731     }
 732     return;
 733   }
 734 
 735   KlassInfoTable cit(_print_class_stats);
 736   if (!cit.allocation_failed()) {
 737     // populate table with object allocation info
 738     size_t missed_count = populate_table(&cit);
 739     if (missed_count != 0) {
 740       st->print_cr("WARNING: Ran out of C-heap; undercounted " SIZE_FORMAT
 741                    " total instances in data below",
 742                    missed_count);
 743     }
 744 
 745     // Sort and print klass instance info
 746     KlassInfoHisto histo(&cit);
 747     HistoClosure hc(&histo);
 748 
 749     cit.iterate(&hc);
 750 
 751     histo.sort();
 752     histo.print_histo_on(st, _print_class_stats, _csv_format, _columns);
 753   } else {
 754     st->print_cr("ERROR: Ran out of C-heap; histogram not generated");
 755   }
 756   st->flush();
 757 }
 758 
 759 class FindInstanceClosure : public ObjectClosure {
 760  private:
 761   Klass* _klass;
 762   GrowableArray<oop>* _result;
 763 
 764  public:
 765   FindInstanceClosure(Klass* k, GrowableArray<oop>* result) : _klass(k), _result(result) {};
 766 
 767   void do_object(oop obj) {
 768     if (obj->is_a(_klass)) {
 769       _result->append(obj);
 770     }
 771   }
 772 };
 773 
 774 void HeapInspection::find_instances_at_safepoint(Klass* k, GrowableArray<oop>* result) {
 775   assert(SafepointSynchronize::is_at_safepoint(), "all threads are stopped");
 776   assert(Heap_lock->is_locked(), "should have the Heap_lock");
 777 
 778   // Ensure that the heap is parsable
 779   Universe::heap()->ensure_parsability(false);  // no need to retire TALBs
 780 
 781   // Iterate over objects in the heap
 782   FindInstanceClosure fic(k, result);
 783   // If this operation encounters a bad object when using CMS,
 784   // consider using safe_object_iterate() which avoids metadata
 785   // objects that may contain bad references.
 786   Universe::heap()->object_iterate(&fic);
 787 }