80 report_gc_end_impl(timestamp, time_partitions);
81
82 _shared_gc_info.set_id(SharedGCInfo::UNSET_GCID);
83 }
84
85 void GCTracer::report_gc_reference_stats(const ReferenceProcessorStats& rps) const {
86 assert_set_gc_id();
87
88 send_reference_stats_event(REF_SOFT, rps.soft_count());
89 send_reference_stats_event(REF_WEAK, rps.weak_count());
90 send_reference_stats_event(REF_FINAL, rps.final_count());
91 send_reference_stats_event(REF_PHANTOM, rps.phantom_count());
92 }
93
94 class ObjectCountEventSenderClosure : public KlassInfoClosure {
95 GCTracer* _gc_tracer;
96 public:
97 ObjectCountEventSenderClosure(GCTracer* gc_tracer) : _gc_tracer(gc_tracer) {}
98 private:
99 void do_cinfo(KlassInfoEntry* entry) {
100 _gc_tracer->send_object_count_after_gc_event(entry->klass(), entry->count(),
101 entry->words() * BytesPerWord);
102 }
103 };
104
105 void GCTracer::report_object_count_after_gc(BoolObjectClosure *is_alive_cl) {
106 if (should_send_object_count_after_gc_event()) {
107 ResourceMark rm;
108
109 KlassInfoTable cit(HeapInspection::start_of_perm_gen());
110 if (!cit.allocation_failed()) {
111 ObjectCountEventSenderClosure event_sender(this);
112 HeapInspection::instance_inspection(&cit, &event_sender, false, is_alive_cl);
113 }
114 }
115 }
116
117 void GCTracer::report_gc_heap_summary(GCWhen::Type when, const GCHeapSummary& heap_summary, const PermGenSummary& perm_gen_summary) const {
118 assert_set_gc_id();
119
120 send_gc_heap_summary_event(when, heap_summary);
121 send_perm_gen_summary_event(when, perm_gen_summary);
|
80 report_gc_end_impl(timestamp, time_partitions);
81
82 _shared_gc_info.set_id(SharedGCInfo::UNSET_GCID);
83 }
84
85 void GCTracer::report_gc_reference_stats(const ReferenceProcessorStats& rps) const {
86 assert_set_gc_id();
87
88 send_reference_stats_event(REF_SOFT, rps.soft_count());
89 send_reference_stats_event(REF_WEAK, rps.weak_count());
90 send_reference_stats_event(REF_FINAL, rps.final_count());
91 send_reference_stats_event(REF_PHANTOM, rps.phantom_count());
92 }
93
94 class ObjectCountEventSenderClosure : public KlassInfoClosure {
95 GCTracer* _gc_tracer;
96 public:
97 ObjectCountEventSenderClosure(GCTracer* gc_tracer) : _gc_tracer(gc_tracer) {}
98 private:
99 void do_cinfo(KlassInfoEntry* entry) {
100 if (is_visible_klass(entry->klass())) {
101 _gc_tracer->send_object_count_after_gc_event(entry->klass(), entry->count(),
102 entry->words() * BytesPerWord);
103 }
104 }
105
106 // Do not expose internal implementation specific classes
107 bool is_visible_klass(klassOop k) {
108 return k->klass_part()->oop_is_instance() ||
109 (k->klass_part()->oop_is_array() && k != Universe::systemObjArrayKlassObj());
110 }
111 };
112
113 void GCTracer::report_object_count_after_gc(BoolObjectClosure *is_alive_cl) {
114 if (should_send_object_count_after_gc_event()) {
115 ResourceMark rm;
116
117 KlassInfoTable cit(HeapInspection::start_of_perm_gen());
118 if (!cit.allocation_failed()) {
119 ObjectCountEventSenderClosure event_sender(this);
120 HeapInspection::instance_inspection(&cit, &event_sender, false, is_alive_cl);
121 }
122 }
123 }
124
125 void GCTracer::report_gc_heap_summary(GCWhen::Type when, const GCHeapSummary& heap_summary, const PermGenSummary& perm_gen_summary) const {
126 assert_set_gc_id();
127
128 send_gc_heap_summary_event(when, heap_summary);
129 send_perm_gen_summary_event(when, perm_gen_summary);
|