src/share/vm/gc_implementation/shared/gcTrace.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
*** 89,117 ****
send_reference_stats_event(REF_WEAK, rps.weak_count());
send_reference_stats_event(REF_FINAL, rps.final_count());
send_reference_stats_event(REF_PHANTOM, rps.phantom_count());
}
! class ObjectCountEventSenderClosure : public KlassInfoClosure {
! GCTracer* _gc_tracer;
! public:
! ObjectCountEventSenderClosure(GCTracer* gc_tracer) : _gc_tracer(gc_tracer) {}
! private:
! void do_cinfo(KlassInfoEntry* entry) {
_gc_tracer->send_object_count_after_gc_event(entry->klass(), entry->count(),
entry->words() * BytesPerWord);
! }
! };
void GCTracer::report_object_count_after_gc(BoolObjectClosure *is_alive_cl) {
if (should_send_object_count_after_gc_event()) {
ResourceMark rm;
KlassInfoTable cit(HeapInspection::start_of_perm_gen());
if (!cit.allocation_failed()) {
! ObjectCountEventSenderClosure event_sender(this);
! HeapInspection::instance_inspection(&cit, &event_sender, false, is_alive_cl);
}
}
}
void GCTracer::report_gc_heap_summary(GCWhen::Type when, const GCHeapSummary& heap_summary, const PermGenSummary& perm_gen_summary) const {
--- 89,136 ----
send_reference_stats_event(REF_WEAK, rps.weak_count());
send_reference_stats_event(REF_FINAL, rps.final_count());
send_reference_stats_event(REF_PHANTOM, rps.phantom_count());
}
! void ObjectCountEventSenderClosure::do_cinfo(KlassInfoEntry* entry) {
! if (should_send_event(entry)) {
! send_event(entry);
! }
! }
!
! void ObjectCountEventSenderClosure::send_event(KlassInfoEntry* entry) {
_gc_tracer->send_object_count_after_gc_event(entry->klass(), entry->count(),
entry->words() * BytesPerWord);
! }
!
! bool ObjectCountEventSenderClosure::should_send_event(KlassInfoEntry* entry) const {
! double percentage_of_heap = ((double) entry->words()) / _used_heap_in_words;
! return percentage_of_heap > _size_threshold_percentage;
! }
!
! bool ObjectCountFilter::do_object_b(oop obj) {
! bool is_alive = _is_alive == NULL? true : _is_alive->do_object_b(obj);
! return is_alive && is_externally_visible_klass(obj->klass());
! }
!
! bool ObjectCountFilter::is_externally_visible_klass(klassOop k) const {
! // Do not expose internal implementation specific classes
! return (k->klass_part()->oop_is_instance() || k->klass_part()->oop_is_array()) &&
! k != Universe::systemObjArrayKlassObj();
! }
void GCTracer::report_object_count_after_gc(BoolObjectClosure *is_alive_cl) {
if (should_send_object_count_after_gc_event()) {
ResourceMark rm;
KlassInfoTable cit(HeapInspection::start_of_perm_gen());
if (!cit.allocation_failed()) {
! ObjectCountFilter object_filter(is_alive_cl);
! HeapInspection::populate_table(&cit, false, &object_filter);
!
! ObjectCountEventSenderClosure event_sender(this, cit.size_of_instances_in_words());
! cit.iterate(&event_sender);
}
}
}
void GCTracer::report_gc_heap_summary(GCWhen::Type when, const GCHeapSummary& heap_summary, const PermGenSummary& perm_gen_summary) const {