Mon, 16 Jul 2012 14:10:34 -0400
7181986: NMT ON: Assertion failure when running jdi ExpiredRequestDeletionTest
Summary: Changed _query_lock to heap object from static object. Also fixed _query_lock and snapshot lock ranks, so they can participate deadlock detection.
Reviewed-by: coleenp, dholmes, kvn
1.1 --- a/src/share/vm/services/memSnapshot.cpp Wed Jul 04 15:55:45 2012 -0400 1.2 +++ b/src/share/vm/services/memSnapshot.cpp Mon Jul 16 14:10:34 2012 -0400 1.3 @@ -173,7 +173,7 @@ 1.4 _staging_area = new (std::nothrow)MemPointerArrayImpl<SeqMemPointerRecord>(); 1.5 } 1.6 1.7 - _lock = new (std::nothrow) Mutex(Monitor::native, "memSnapshotLock"); 1.8 + _lock = new (std::nothrow) Mutex(Monitor::max_nonleaf - 1, "memSnapshotLock"); 1.9 NOT_PRODUCT(_untracked_count = 0;) 1.10 } 1.11
2.1 --- a/src/share/vm/services/memTracker.cpp Wed Jul 04 15:55:45 2012 -0400 2.2 +++ b/src/share/vm/services/memTracker.cpp Mon Jul 16 14:10:34 2012 -0400 2.3 @@ -54,7 +54,7 @@ 2.4 MemRecorder* MemTracker::_global_recorder = NULL; 2.5 MemSnapshot* MemTracker::_snapshot = NULL; 2.6 MemBaseline MemTracker::_baseline; 2.7 -Mutex MemTracker::_query_lock(Monitor::native, "NMT_queryLock"); 2.8 +Mutex* MemTracker::_query_lock = NULL; 2.9 volatile MemRecorder* MemTracker::_merge_pending_queue = NULL; 2.10 volatile MemRecorder* MemTracker::_pooled_recorders = NULL; 2.11 MemTrackWorker* MemTracker::_worker_thread = NULL; 2.12 @@ -89,6 +89,12 @@ 2.13 return; 2.14 } 2.15 2.16 + _query_lock = new (std::nothrow) Mutex(Monitor::max_nonleaf, "NMT_queryLock"); 2.17 + if (_query_lock == NULL) { 2.18 + shutdown(NMT_out_of_memory); 2.19 + return; 2.20 + } 2.21 + 2.22 debug_only(_main_thread_tid = os::current_thread_id();) 2.23 _state = NMT_bootstrapping_single_thread; 2.24 NMT_track_callsite = (_tracking_level == NMT_detail && can_walk_stack()); 2.25 @@ -164,7 +170,7 @@ 2.26 { 2.27 // shared baseline and snapshot are the only objects needed to 2.28 // create query results 2.29 - MutexLockerEx locker(&_query_lock, true); 2.30 + MutexLockerEx locker(_query_lock, true); 2.31 // cleanup baseline data and snapshot 2.32 _baseline.clear(); 2.33 delete _snapshot; 2.34 @@ -534,7 +540,7 @@ 2.35 2.36 // baseline current memory snapshot 2.37 bool MemTracker::baseline() { 2.38 - MutexLockerEx lock(&_query_lock, true); 2.39 + MutexLockerEx lock(_query_lock, true); 2.40 MemSnapshot* snapshot = get_snapshot(); 2.41 if (snapshot != NULL) { 2.42 return _baseline.baseline(*snapshot, false); 2.43 @@ -545,7 +551,7 @@ 2.44 // print memory usage from current snapshot 2.45 bool MemTracker::print_memory_usage(BaselineOutputer& out, size_t unit, bool summary_only) { 2.46 MemBaseline baseline; 2.47 - MutexLockerEx lock(&_query_lock, true); 2.48 + MutexLockerEx lock(_query_lock, true); 2.49 MemSnapshot* snapshot = get_snapshot(); 2.50 if (snapshot != NULL && baseline.baseline(*snapshot, summary_only)) { 2.51 BaselineReporter reporter(out, unit); 2.52 @@ -557,7 +563,7 @@ 2.53 2.54 // compare memory usage between current snapshot and baseline 2.55 bool MemTracker::compare_memory_usage(BaselineOutputer& out, size_t unit, bool summary_only) { 2.56 - MutexLockerEx lock(&_query_lock, true); 2.57 + MutexLockerEx lock(_query_lock, true); 2.58 if (_baseline.baselined()) { 2.59 MemBaseline baseline; 2.60 MemSnapshot* snapshot = get_snapshot();
3.1 --- a/src/share/vm/services/memTracker.hpp Wed Jul 04 15:55:45 2012 -0400 3.2 +++ b/src/share/vm/services/memTracker.hpp Mon Jul 16 14:10:34 2012 -0400 3.3 @@ -126,6 +126,8 @@ 3.4 return "Native memory tracking has been shutdown by user"; 3.5 case NMT_normal: 3.6 return "Native memory tracking has been shutdown due to process exiting"; 3.7 + case NMT_out_of_memory: 3.8 + return "Native memory tracking has been shutdown due to out of native memory"; 3.9 case NMT_initialization: 3.10 return "Native memory tracking failed to initialize"; 3.11 case NMT_error_reporting: 3.12 @@ -336,7 +338,7 @@ 3.13 static MemBaseline _baseline; 3.14 3.15 // query lock 3.16 - static Mutex _query_lock; 3.17 + static Mutex* _query_lock; 3.18 3.19 // a thread can start to allocate memory before it is attached 3.20 // to VM 'Thread', those memory activities are recorded here.