comparison src/share/vm/services/memSnapshot.cpp @ 6977:ed8b1e39ff4f

8002273: NMT to report JNI memory leaks when -Xcheck:jni is on Summary: Allows NMT to report that JNI thread failed to detach from JVM before exiting, which leaks the JavaThread object when check:jni option is on. Reviewed-by: acorn, dholmes, coleenp, ctornqvi
author zgu
date Fri, 09 Nov 2012 11:04:06 -0500
parents 69ad7823b1ca
children 8c413497f434
comparison
equal deleted inserted replaced
6940:18fb7da42534 6977:ed8b1e39ff4f
121 121
122 // we don't consolidate reserved regions, since they may be categorized 122 // we don't consolidate reserved regions, since they may be categorized
123 // in different types. 123 // in different types.
124 bool VMMemPointerIterator::add_reserved_region(MemPointerRecord* rec) { 124 bool VMMemPointerIterator::add_reserved_region(MemPointerRecord* rec) {
125 assert(rec->is_allocation_record(), "Sanity check"); 125 assert(rec->is_allocation_record(), "Sanity check");
126 VMMemRegion* cur = (VMMemRegion*)current(); 126 VMMemRegion* reserved_region = (VMMemRegion*)current();
127 127
128 // we don't have anything yet 128 // we don't have anything yet
129 if (cur == NULL) { 129 if (reserved_region == NULL) {
130 return insert_record(rec); 130 return insert_record(rec);
131 } 131 }
132 132
133 assert(cur->is_reserved_region(), "Sanity check"); 133 assert(reserved_region->is_reserved_region(), "Sanity check");
134 // duplicated records 134 // duplicated records
135 if (cur->is_same_region(rec)) { 135 if (reserved_region->is_same_region(rec)) {
136 return true; 136 return true;
137 } 137 }
138 assert(cur->base() > rec->addr(), "Just check: locate()"); 138 // Overlapping stack regions indicate that a JNI thread failed to
139 assert(!cur->overlaps_region(rec), "overlapping reserved regions"); 139 // detach from the VM before exiting. This leaks the JavaThread object.
140 if (CheckJNICalls) {
141 guarantee(FLAGS_TO_MEMORY_TYPE(reserved_region->flags()) != mtThreadStack ||
142 !reserved_region->overlaps_region(rec),
143 "Attached JNI thread exited without being detached");
144 }
145 // otherwise, we should not have overlapping reserved regions
146 assert(FLAGS_TO_MEMORY_TYPE(reserved_region->flags()) == mtThreadStack ||
147 reserved_region->base() > rec->addr(), "Just check: locate()");
148 assert(FLAGS_TO_MEMORY_TYPE(reserved_region->flags()) == mtThreadStack ||
149 !reserved_region->overlaps_region(rec), "overlapping reserved regions");
150
140 return insert_record(rec); 151 return insert_record(rec);
141 } 152 }
142 153
143 // we do consolidate committed regions 154 // we do consolidate committed regions
144 bool VMMemPointerIterator::add_committed_region(MemPointerRecord* rec) { 155 bool VMMemPointerIterator::add_committed_region(MemPointerRecord* rec) {