src/share/vm/gc_implementation/shared/gcTrace.cpp

Print this page
rev 4470 : 8011425: NPE in TestObjectCountAfterGCEvent.java on Linux32


  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);