Mercurial > hg > graal-jvmci-8
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) { |