src/share/vm/services/memRecorder.cpp

Print this page
rev 3953 : JDK-8005012: Add WB APIs to better support NMT testing
Summary:


  38 
  39   MemPointerRecord* itr_next = (MemPointerRecord*)_itr.next();
  40 
  41   // don't collapse virtual memory records
  42   while (itr_next != NULL && !itr_cur->is_vm_pointer() &&
  43     !itr_next->is_vm_pointer() &&
  44     same_kind(itr_cur, itr_next)) {
  45     itr_cur = itr_next;
  46     itr_next = (MemPointerRecord*)_itr.next();
  47   }
  48 
  49   return itr_cur;
  50 }
  51 
  52 
  53 volatile jint MemRecorder::_instance_count = 0;
  54 
  55 MemRecorder::MemRecorder() {
  56   assert(MemTracker::is_on(), "Native memory tracking is off");
  57   Atomic::inc(&_instance_count);
  58   debug_only(set_generation();)
  59 
  60   if (MemTracker::track_callsite()) {
  61     _pointer_records = new (std::nothrow)FixedSizeMemPointerArray<SeqMemPointerRecordEx,
  62         DEFAULT_RECORDER_PTR_ARRAY_SIZE>();
  63   } else {
  64     _pointer_records = new (std::nothrow)FixedSizeMemPointerArray<SeqMemPointerRecord,
  65         DEFAULT_RECORDER_PTR_ARRAY_SIZE>();
  66   }
  67   _next = NULL;
  68 
  69 
  70   if (_pointer_records != NULL) {
  71     // recode itself
  72     record((address)this, (MemPointerRecord::malloc_tag()|mtNMT|otNMTRecorder),
  73         sizeof(MemRecorder), CALLER_PC);
  74     record((address)_pointer_records, (MemPointerRecord::malloc_tag()|mtNMT|otNMTRecorder),
  75         _pointer_records->instance_size(),CURRENT_PC);
  76   }
  77 }
  78 


 134 
 135   if (MemTracker::track_callsite()) {
 136     SeqMemPointerRecordEx ap(p, flags, size, pc);
 137     debug_only(check_dup_seq(ap.seq());)
 138     return _pointer_records->append(&ap);
 139   } else {
 140     SeqMemPointerRecord ap(p, flags, size);
 141     debug_only(check_dup_seq(ap.seq());)
 142     return _pointer_records->append(&ap);
 143   }
 144 }
 145 
 146   // iterator for alloc pointers
 147 SequencedRecordIterator MemRecorder::pointer_itr() {
 148   assert(_pointer_records != NULL, "just check");
 149   _pointer_records->sort((FN_SORT)sort_record_fn);
 150   return SequencedRecordIterator(_pointer_records);
 151 }
 152 
 153 
 154 #ifdef ASSERT
 155 void MemRecorder::set_generation() {
 156   _generation = SequenceGenerator::current_generation();
 157 }


 158 
 159 void MemRecorder::check_dup_seq(jint seq) const {
 160   MemPointerArrayIteratorImpl itr(_pointer_records);
 161   MemPointerRecord* rc = (MemPointerRecord*)itr.current();
 162   while (rc != NULL) {
 163     assert(rc->seq() != seq, "dup seq");
 164     rc = (MemPointerRecord*)itr.next();
 165   }
 166 }
 167 
 168 #endif


  38 
  39   MemPointerRecord* itr_next = (MemPointerRecord*)_itr.next();
  40 
  41   // don't collapse virtual memory records
  42   while (itr_next != NULL && !itr_cur->is_vm_pointer() &&
  43     !itr_next->is_vm_pointer() &&
  44     same_kind(itr_cur, itr_next)) {
  45     itr_cur = itr_next;
  46     itr_next = (MemPointerRecord*)_itr.next();
  47   }
  48 
  49   return itr_cur;
  50 }
  51 
  52 
  53 volatile jint MemRecorder::_instance_count = 0;
  54 
  55 MemRecorder::MemRecorder() {
  56   assert(MemTracker::is_on(), "Native memory tracking is off");
  57   Atomic::inc(&_instance_count);
  58   set_generation();
  59 
  60   if (MemTracker::track_callsite()) {
  61     _pointer_records = new (std::nothrow)FixedSizeMemPointerArray<SeqMemPointerRecordEx,
  62         DEFAULT_RECORDER_PTR_ARRAY_SIZE>();
  63   } else {
  64     _pointer_records = new (std::nothrow)FixedSizeMemPointerArray<SeqMemPointerRecord,
  65         DEFAULT_RECORDER_PTR_ARRAY_SIZE>();
  66   }
  67   _next = NULL;
  68 
  69 
  70   if (_pointer_records != NULL) {
  71     // recode itself
  72     record((address)this, (MemPointerRecord::malloc_tag()|mtNMT|otNMTRecorder),
  73         sizeof(MemRecorder), CALLER_PC);
  74     record((address)_pointer_records, (MemPointerRecord::malloc_tag()|mtNMT|otNMTRecorder),
  75         _pointer_records->instance_size(),CURRENT_PC);
  76   }
  77 }
  78 


 134 
 135   if (MemTracker::track_callsite()) {
 136     SeqMemPointerRecordEx ap(p, flags, size, pc);
 137     debug_only(check_dup_seq(ap.seq());)
 138     return _pointer_records->append(&ap);
 139   } else {
 140     SeqMemPointerRecord ap(p, flags, size);
 141     debug_only(check_dup_seq(ap.seq());)
 142     return _pointer_records->append(&ap);
 143   }
 144 }
 145 
 146   // iterator for alloc pointers
 147 SequencedRecordIterator MemRecorder::pointer_itr() {
 148   assert(_pointer_records != NULL, "just check");
 149   _pointer_records->sort((FN_SORT)sort_record_fn);
 150   return SequencedRecordIterator(_pointer_records);
 151 }
 152 
 153 

 154 void MemRecorder::set_generation() {
 155   _generation = SequenceGenerator::current_generation();
 156 }
 157 
 158 #ifdef ASSERT
 159 
 160 void MemRecorder::check_dup_seq(jint seq) const {
 161   MemPointerArrayIteratorImpl itr(_pointer_records);
 162   MemPointerRecord* rc = (MemPointerRecord*)itr.current();
 163   while (rc != NULL) {
 164     assert(rc->seq() != seq, "dup seq");
 165     rc = (MemPointerRecord*)itr.next();
 166   }
 167 }
 168 
 169 #endif