7181986: NMT ON: Assertion failure when running jdi ExpiredRequestDeletionTest

Mon, 16 Jul 2012 14:10:34 -0400

author
zgu
date
Mon, 16 Jul 2012 14:10:34 -0400
changeset 3936
f1f45dddb0bd
parent 3904
ace99a6ffc83
child 3937
d5bc62fcfac7

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

src/share/vm/services/memSnapshot.cpp file | annotate | diff | comparison | revisions
src/share/vm/services/memTracker.cpp file | annotate | diff | comparison | revisions
src/share/vm/services/memTracker.hpp file | annotate | diff | comparison | revisions
     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.

mercurial