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
|