< prev index next >

src/hotspot/share/memory/heapInspection.cpp

Print this page

        

*** 235,244 **** --- 235,280 ---- size_t KlassInfoTable::size_of_instances_in_words() const { return _size_of_instances_in_words; } + // Return false if the entry could not be recorded on account + // of running out of space required to create a new entry. + bool KlassInfoTable::merge_entry(const KlassInfoEntry* cie) { + Klass* k = cie->klass(); + KlassInfoEntry* elt = lookup(k); + // 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() + cie->count()); + elt->set_words(elt->words() + cie->words()); + _size_of_instances_in_words += cie->words(); + return true; + } else { + return false; + } + } + + class KlassInfoTableMergeClosure : public KlassInfoClosure { + private: + KlassInfoTable* _dest; + bool _success; + public: + KlassInfoTableMergeClosure(KlassInfoTable* table) : _dest(table), _success(true) {} + void do_cinfo(KlassInfoEntry* cie) { + _success &= _dest->merge_entry(cie); + } + bool is_success() { return _success; } + }; + + // merge from table + bool KlassInfoTable::merge(KlassInfoTable* table) { + KlassInfoTableMergeClosure closure(this); + table->iterate(&closure); + return closure.is_success(); + } + int KlassInfoHisto::sort_helper(KlassInfoEntry** e1, KlassInfoEntry** e2) { return (*e1)->compare(*e1,*e2); } KlassInfoHisto::KlassInfoHisto(KlassInfoTable* cit) :
*** 502,526 **** bool should_visit(oop obj) { return _filter == NULL || _filter->do_object_b(obj); } }; ! size_t HeapInspection::populate_table(KlassInfoTable* cit, BoolObjectClosure *filter) { ResourceMark rm; RecordInstanceClosure ric(cit, filter); Universe::heap()->object_iterate(&ric); ! return ric.missed_count(); } ! void HeapInspection::heap_inspection(outputStream* st) { ResourceMark rm; KlassInfoTable cit(false); if (!cit.allocation_failed()) { // populate table with object allocation info ! size_t missed_count = populate_table(&cit); if (missed_count != 0) { log_info(gc, classhisto)("WARNING: Ran out of C-heap; undercounted " SIZE_FORMAT " total instances in data below", missed_count); } --- 538,608 ---- bool should_visit(oop obj) { return _filter == NULL || _filter->do_object_b(obj); } }; ! void ParHeapInspectTask::work(uint worker_id) { ! size_t missed_count = 0; ! if (!_success) { ! // other worker has failed on parallel iteration. ! return; ! } ! ! KlassInfoTable cit(false); ! if (!cit.allocation_failed()) { ! RecordInstanceClosure ric(&cit, _filter); ! do_object_iterate_parallel(&ric, worker_id); ! missed_count = ric.missed_count(); ! } else { ! // fail to allocate memory, stop parallel mode. ! _success = false; ! return; ! } ! { ! MutexLocker x(&_mutex); ! ! if (!_shared_cit->merge(&cit)) { ! _success = false; ! return; ! } ! *_shared_missed_count += missed_count; ! } ! } ! ! size_t HeapInspection::populate_table(KlassInfoTable* cit, BoolObjectClosure *filter, size_t parallel_thread_num) { ResourceMark rm; + size_t missed_count = 0; + bool do_serial = (parallel_thread_num == 1); + // try parallel first. + if (parallel_thread_num > 1) { + bool succ = Universe::heap()->run_par_heap_inspect_task(cit, filter, &missed_count, parallel_thread_num); + if (succ) { + do_serial = false; + } else { + // heap does not support parallel iteration, or parallel task fail because of native memory oom. + // use object_iterate. + do_serial = true; + missed_count = 0; + } + } + if (do_serial) { RecordInstanceClosure ric(cit, filter); Universe::heap()->object_iterate(&ric); ! missed_count = ric.missed_count(); ! } ! return missed_count; } ! void HeapInspection::heap_inspection(outputStream* st, size_t parallel_thread_num) { ResourceMark rm; KlassInfoTable cit(false); if (!cit.allocation_failed()) { + size_t missed_count = 0;; // populate table with object allocation info ! missed_count = populate_table(&cit, NULL, parallel_thread_num); if (missed_count != 0) { log_info(gc, classhisto)("WARNING: Ran out of C-heap; undercounted " SIZE_FORMAT " total instances in data below", missed_count); }
< prev index next >