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");
}