Print this page
rev 4524 : 8012086: The object count event should only send events for instances occupying more than 0.5% of the heap
Reviewed-by: brutisso, jwilhelm

Split Split Close
Expand all
Collapse all
          --- old/src/share/vm/gc_implementation/shared/gcTrace.cpp
          +++ new/src/share/vm/gc_implementation/shared/gcTrace.cpp
↓ open down ↓ 83 lines elided ↑ open up ↑
  84   84  
  85   85  void GCTracer::report_gc_reference_stats(const ReferenceProcessorStats& rps) const {
  86   86    assert_set_gc_id();
  87   87  
  88   88    send_reference_stats_event(REF_SOFT, rps.soft_count());
  89   89    send_reference_stats_event(REF_WEAK, rps.weak_count());
  90   90    send_reference_stats_event(REF_FINAL, rps.final_count());
  91   91    send_reference_stats_event(REF_PHANTOM, rps.phantom_count());
  92   92  }
  93   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      -      }
       94 +void ObjectCountEventSenderClosure::do_cinfo(KlassInfoEntry* entry) {
       95 +  if (should_send_event(entry)) {
       96 +    send_event(entry);
 104   97    }
       98 +}
 105   99  
      100 +void ObjectCountEventSenderClosure::send_event(KlassInfoEntry* entry) {
      101 +  _gc_tracer->send_object_count_after_gc_event(entry->klass(), entry->count(),
      102 +                                               entry->words() * BytesPerWord);
      103 +}
      104 +
      105 +bool ObjectCountEventSenderClosure::should_send_event(KlassInfoEntry* entry) const {
      106 +  double percentage_of_heap = ((double) entry->words()) / _total_size_in_words;
      107 +  return percentage_of_heap > _size_threshold_percentage;
      108 +}
      109 +
      110 +bool ObjectCountFilter::do_object_b(oop obj) {
      111 +  bool is_alive = _is_alive == NULL? true : _is_alive->do_object_b(obj);
      112 +  return is_alive && is_externally_visible_klass(obj->klass());
      113 +}
      114 +
      115 +bool ObjectCountFilter::is_externally_visible_klass(klassOop k) const {
 106  116    // 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      -};
      117 +  return (k->klass_part()->oop_is_instance() || k->klass_part()->oop_is_array()) &&
      118 +         k != Universe::systemObjArrayKlassObj();
      119 +}
 112  120  
 113  121  void GCTracer::report_object_count_after_gc(BoolObjectClosure *is_alive_cl) {
 114  122    if (should_send_object_count_after_gc_event()) {
 115  123      ResourceMark rm;
 116  124  
 117  125      KlassInfoTable cit(HeapInspection::start_of_perm_gen());
 118  126      if (!cit.allocation_failed()) {
 119      -      ObjectCountEventSenderClosure event_sender(this);
 120      -      HeapInspection::instance_inspection(&cit, &event_sender, false, is_alive_cl);
      127 +      ObjectCountFilter object_filter(is_alive_cl);
      128 +      HeapInspection::populate_table(&cit, false, &object_filter);
      129 +
      130 +      ObjectCountEventSenderClosure event_sender(this, cit.size_of_instances_in_words());
      131 +      cit.iterate(&event_sender);
 121  132      }
 122  133    }
 123  134  }
 124  135  
 125  136  void GCTracer::report_gc_heap_summary(GCWhen::Type when, const GCHeapSummary& heap_summary, const PermGenSummary& perm_gen_summary) const {
 126  137    assert_set_gc_id();
 127  138  
 128  139    send_gc_heap_summary_event(when, heap_summary);
 129  140    send_perm_gen_summary_event(when, perm_gen_summary);
 130  141  }
↓ open down ↓ 74 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX