8002273: NMT to report JNI memory leaks when -Xcheck:jni is on

Fri, 09 Nov 2012 11:04:06 -0500

author
zgu
date
Fri, 09 Nov 2012 11:04:06 -0500
changeset 4272
ed8b1e39ff4f
parent 4251
18fb7da42534
child 4273
4efcd79826f2

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  

mercurial