src/share/vm/memory/heapInspection.cpp

Print this page
rev 4462 : 8012086: The object count event should only send events for instances occupying more than 0.5% of the heap

@@ -111,13 +111,12 @@
     delete elt;
     elt = next;
   }
 }
 
-KlassInfoTable::KlassInfoTable(HeapWord* ref) {
-  _size = 0;
-  _ref = ref;
+KlassInfoTable::KlassInfoTable(HeapWord* ref) :
+  _size(0), _ref(ref), _size_of_instances_in_words(0) {
   _buckets = (KlassInfoBucket *) os::malloc(sizeof(KlassInfoBucket) * _num_buckets, mtInternal);
   if (_buckets != NULL) {
     _size = _num_buckets;
     for (int index = 0; index < _size; index++) {
       _buckets[index].initialize();

@@ -158,10 +157,11 @@
   // elt may be NULL if it's a new klass for which we
   // could not allocate space for a new entry in the hashtable.
   if (elt != NULL) {
     elt->set_count(elt->count() + 1);
     elt->set_words(elt->words() + obj->size());
+    _size_of_instances_in_words += obj->size();
     return true;
   } else {
     return false;
   }
 }

@@ -171,10 +171,14 @@
   for (int index = 0; index < _size; index++) {
     _buckets[index].iterate(cic);
   }
 }
 
+size_t KlassInfoTable::size_of_instances_in_words() const {
+  return _size_of_instances_in_words;
+}
+
 int KlassInfoHisto::sort_helper(KlassInfoEntry** e1, KlassInfoEntry** e2) {
   return (*e1)->compare(*e1,*e2);
 }
 
 KlassInfoHisto::KlassInfoHisto(const char* title) :

@@ -280,23 +284,21 @@
     SharedHeap* sh = SharedHeap::heap();
     sh->gc_epilogue(false /* !full */); // release all acquired locks, etc.
   }
 }
 
-size_t HeapInspection::instance_inspection(KlassInfoTable* cit,
-                                           KlassInfoClosure* cl,
+size_t HeapInspection::populate_table(KlassInfoTable* cit,
                                            bool need_prologue,
-                                           BoolObjectClosure* filter) {
+                                      BoolObjectClosure *filter) {
   ResourceMark rm;
 
   if (need_prologue) {
     prologue();
   }
 
   RecordInstanceClosure ric(cit, filter);
   Universe::heap()->object_iterate(&ric);
-  cit->iterate(cl);
 
   // need to run epilogue if we run prologue
   if (need_prologue) {
     epilogue();
   }

@@ -307,21 +309,24 @@
 void HeapInspection::heap_inspection(outputStream* st, bool need_prologue) {
   ResourceMark rm;
 
   KlassInfoTable cit(start_of_perm_gen());
   if (!cit.allocation_failed()) {
-    KlassInfoHisto histo("\n"
-                     " num     #instances         #bytes  class name\n"
-                     "----------------------------------------------");
-    HistoClosure hc(&histo);
-
-    size_t missed_count = instance_inspection(&cit, &hc, need_prologue);
+    size_t missed_count = populate_table(&cit, need_prologue);
     if (missed_count != 0) {
       st->print_cr("WARNING: Ran out of C-heap; undercounted " SIZE_FORMAT
                    " total instances in data below",
                    missed_count);
     }
+
+    KlassInfoHisto histo("\n"
+                     " num     #instances         #bytes  class name\n"
+                     "----------------------------------------------");
+    HistoClosure hc(&histo);
+
+    cit.iterate(&hc);
+
     histo.sort();
     histo.print_on(st);
   } else {
     st->print_cr("WARNING: Ran out of C-heap; histogram not generated");
   }