28 #include "services/memBaseline.hpp" 29 #include "services/memRecorder.hpp" 30 #include "services/memPtr.hpp" 31 #include "services/memTracker.hpp" 32 33 MemPointer* SequencedRecordIterator::next_record() { 34 MemPointer* itr_cur = _itr.current(); 35 if (itr_cur == NULL) return NULL; 36 MemPointer* itr_next = _itr.next(); 37 38 while (itr_next != NULL && 39 same_kind((MemPointerRecord*)itr_cur, (MemPointerRecord*)itr_next)) { 40 itr_cur = itr_next; 41 itr_next = _itr.next(); 42 } 43 44 return itr_cur; 45 } 46 47 48 debug_only(volatile jint MemRecorder::_instance_count = 0;) 49 50 MemRecorder::MemRecorder() { 51 assert(MemTracker::is_on(), "Native memory tracking is off"); 52 debug_only(Atomic::inc(&_instance_count);) 53 debug_only(set_generation();) 54 55 if (MemTracker::track_callsite()) { 56 _pointer_records = new (std::nothrow)FixedSizeMemPointerArray<SeqMemPointerRecordEx, 57 DEFAULT_RECORDER_PTR_ARRAY_SIZE>(); 58 } else { 59 _pointer_records = new (std::nothrow)FixedSizeMemPointerArray<SeqMemPointerRecord, 60 DEFAULT_RECORDER_PTR_ARRAY_SIZE>(); 61 } 62 _next = NULL; 63 64 65 if (_pointer_records != NULL) { 66 // recode itself 67 record((address)this, (MemPointerRecord::malloc_tag()|mtNMT|otNMTRecorder), 68 sizeof(MemRecorder), CALLER_PC); 69 record((address)_pointer_records, (MemPointerRecord::malloc_tag()|mtNMT|otNMTRecorder), 70 _pointer_records->instance_size(),CURRENT_PC); 71 } 72 } 73 74 MemRecorder::~MemRecorder() { 75 if (_pointer_records != NULL) { 76 if (MemTracker::is_on()) { 77 MemTracker::record_free((address)_pointer_records, mtNMT); 78 MemTracker::record_free((address)this, mtNMT); 79 } 80 delete _pointer_records; 81 } 82 if (_next != NULL) { 83 delete _next; 84 } 85 86 #ifdef ASSERT 87 Atomic::dec(&_instance_count); 88 #endif 89 } 90 91 // Sorting order: 92 // 1. memory block address 93 // 2. mem pointer record tags 94 // 3. sequence number 95 int MemRecorder::sort_record_fn(const void* e1, const void* e2) { 96 const MemPointerRecord* p1 = (const MemPointerRecord*)e1; 97 const MemPointerRecord* p2 = (const MemPointerRecord*)e2; 98 int delta = UNSIGNED_COMPARE(p1->addr(), p2->addr()); 99 if (delta == 0) { 100 int df = UNSIGNED_COMPARE((p1->flags() & MemPointerRecord::tag_masks), 101 (p2->flags() & MemPointerRecord::tag_masks)); 102 if (df == 0) { 103 assert(p1->seq() != p2->seq(), "dup seq"); 104 return p1->seq() - p2->seq(); 105 } else { 106 return df; 107 } 108 } else { | 28 #include "services/memBaseline.hpp" 29 #include "services/memRecorder.hpp" 30 #include "services/memPtr.hpp" 31 #include "services/memTracker.hpp" 32 33 MemPointer* SequencedRecordIterator::next_record() { 34 MemPointer* itr_cur = _itr.current(); 35 if (itr_cur == NULL) return NULL; 36 MemPointer* itr_next = _itr.next(); 37 38 while (itr_next != NULL && 39 same_kind((MemPointerRecord*)itr_cur, (MemPointerRecord*)itr_next)) { 40 itr_cur = itr_next; 41 itr_next = _itr.next(); 42 } 43 44 return itr_cur; 45 } 46 47 48 volatile jint MemRecorder::_instance_count = 0; 49 50 MemRecorder::MemRecorder() { 51 assert(MemTracker::is_on(), "Native memory tracking is off"); 52 Atomic::inc(&_instance_count); 53 debug_only(set_generation();) 54 55 if (MemTracker::track_callsite()) { 56 _pointer_records = new (std::nothrow)FixedSizeMemPointerArray<SeqMemPointerRecordEx, 57 DEFAULT_RECORDER_PTR_ARRAY_SIZE>(); 58 } else { 59 _pointer_records = new (std::nothrow)FixedSizeMemPointerArray<SeqMemPointerRecord, 60 DEFAULT_RECORDER_PTR_ARRAY_SIZE>(); 61 } 62 _next = NULL; 63 64 65 if (_pointer_records != NULL) { 66 // recode itself 67 record((address)this, (MemPointerRecord::malloc_tag()|mtNMT|otNMTRecorder), 68 sizeof(MemRecorder), CALLER_PC); 69 record((address)_pointer_records, (MemPointerRecord::malloc_tag()|mtNMT|otNMTRecorder), 70 _pointer_records->instance_size(),CURRENT_PC); 71 } 72 } 73 74 MemRecorder::~MemRecorder() { 75 if (_pointer_records != NULL) { 76 if (MemTracker::is_on()) { 77 MemTracker::record_free((address)_pointer_records, mtNMT); 78 MemTracker::record_free((address)this, mtNMT); 79 } 80 delete _pointer_records; 81 } 82 if (_next != NULL) { 83 delete _next; 84 } 85 86 Atomic::dec(&_instance_count); 87 } 88 89 // Sorting order: 90 // 1. memory block address 91 // 2. mem pointer record tags 92 // 3. sequence number 93 int MemRecorder::sort_record_fn(const void* e1, const void* e2) { 94 const MemPointerRecord* p1 = (const MemPointerRecord*)e1; 95 const MemPointerRecord* p2 = (const MemPointerRecord*)e2; 96 int delta = UNSIGNED_COMPARE(p1->addr(), p2->addr()); 97 if (delta == 0) { 98 int df = UNSIGNED_COMPARE((p1->flags() & MemPointerRecord::tag_masks), 99 (p2->flags() & MemPointerRecord::tag_masks)); 100 if (df == 0) { 101 assert(p1->seq() != p2->seq(), "dup seq"); 102 return p1->seq() - p2->seq(); 103 } else { 104 return df; 105 } 106 } else { |