src/share/vm/gc_implementation/shared/gcTrace.cpp
Print this page
@@ -25,10 +25,12 @@
#include "precompiled.hpp"
#include "gc_implementation/shared/gcHeapSummary.hpp"
#include "gc_implementation/shared/gcTimer.hpp"
#include "gc_implementation/shared/gcTrace.hpp"
#include "gc_implementation/shared/promotionFailedInfo.hpp"
+#include "memory/heapInspection.hpp"
+#include "memory/iterator.hpp"
#include "memory/referenceProcessorStats.hpp"
#include "utilities/globalDefinitions.hpp"
#define assert_unset_gc_id() assert(_shared_gc_info.id() == SharedGCInfo::UNSET_GCID, "GC already started?")
#define assert_set_gc_id() assert(_shared_gc_info.id() != SharedGCInfo::UNSET_GCID, "GC not started?")
@@ -83,10 +85,33 @@
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 {
assert_set_gc_id();
send_gc_heap_summary_event(when, heap_summary);
send_perm_gen_summary_event(when, perm_gen_summary);