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); 122 } | 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); 130 } |