Fri, 09 Nov 2012 11:04:06 -0500
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
src/share/vm/services/memSnapshot.cpp | file | annotate | diff | comparison | revisions |
1.1 --- a/src/share/vm/services/memSnapshot.cpp Tue Nov 06 15:09:37 2012 -0500 1.2 +++ b/src/share/vm/services/memSnapshot.cpp Fri Nov 09 11:04:06 2012 -0500 1.3 @@ -123,20 +123,31 @@ 1.4 // in different types. 1.5 bool VMMemPointerIterator::add_reserved_region(MemPointerRecord* rec) { 1.6 assert(rec->is_allocation_record(), "Sanity check"); 1.7 - VMMemRegion* cur = (VMMemRegion*)current(); 1.8 + VMMemRegion* reserved_region = (VMMemRegion*)current(); 1.9 1.10 // we don't have anything yet 1.11 - if (cur == NULL) { 1.12 + if (reserved_region == NULL) { 1.13 return insert_record(rec); 1.14 } 1.15 1.16 - assert(cur->is_reserved_region(), "Sanity check"); 1.17 + assert(reserved_region->is_reserved_region(), "Sanity check"); 1.18 // duplicated records 1.19 - if (cur->is_same_region(rec)) { 1.20 + if (reserved_region->is_same_region(rec)) { 1.21 return true; 1.22 } 1.23 - assert(cur->base() > rec->addr(), "Just check: locate()"); 1.24 - assert(!cur->overlaps_region(rec), "overlapping reserved regions"); 1.25 + // Overlapping stack regions indicate that a JNI thread failed to 1.26 + // detach from the VM before exiting. This leaks the JavaThread object. 1.27 + if (CheckJNICalls) { 1.28 + guarantee(FLAGS_TO_MEMORY_TYPE(reserved_region->flags()) != mtThreadStack || 1.29 + !reserved_region->overlaps_region(rec), 1.30 + "Attached JNI thread exited without being detached"); 1.31 + } 1.32 + // otherwise, we should not have overlapping reserved regions 1.33 + assert(FLAGS_TO_MEMORY_TYPE(reserved_region->flags()) == mtThreadStack || 1.34 + reserved_region->base() > rec->addr(), "Just check: locate()"); 1.35 + assert(FLAGS_TO_MEMORY_TYPE(reserved_region->flags()) == mtThreadStack || 1.36 + !reserved_region->overlaps_region(rec), "overlapping reserved regions"); 1.37 + 1.38 return insert_record(rec); 1.39 } 1.40