comparison src/share/vm/services/memTracker.cpp @ 6232:f1f45dddb0bd

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
author zgu
date Mon, 16 Jul 2012 14:10:34 -0400
parents d2a62e0f25eb
children d5bc62fcfac7
comparison
equal deleted inserted replaced
6201:ace99a6ffc83 6232:f1f45dddb0bd
52 52
53 53
54 MemRecorder* MemTracker::_global_recorder = NULL; 54 MemRecorder* MemTracker::_global_recorder = NULL;
55 MemSnapshot* MemTracker::_snapshot = NULL; 55 MemSnapshot* MemTracker::_snapshot = NULL;
56 MemBaseline MemTracker::_baseline; 56 MemBaseline MemTracker::_baseline;
57 Mutex MemTracker::_query_lock(Monitor::native, "NMT_queryLock"); 57 Mutex* MemTracker::_query_lock = NULL;
58 volatile MemRecorder* MemTracker::_merge_pending_queue = NULL; 58 volatile MemRecorder* MemTracker::_merge_pending_queue = NULL;
59 volatile MemRecorder* MemTracker::_pooled_recorders = NULL; 59 volatile MemRecorder* MemTracker::_pooled_recorders = NULL;
60 MemTrackWorker* MemTracker::_worker_thread = NULL; 60 MemTrackWorker* MemTracker::_worker_thread = NULL;
61 int MemTracker::_sync_point_skip_count = 0; 61 int MemTracker::_sync_point_skip_count = 0;
62 MemTracker::NMTLevel MemTracker::_tracking_level = MemTracker::NMT_off; 62 MemTracker::NMTLevel MemTracker::_tracking_level = MemTracker::NMT_off;
87 if (UseMallocOnly) { 87 if (UseMallocOnly) {
88 shutdown(NMT_use_malloc_only); 88 shutdown(NMT_use_malloc_only);
89 return; 89 return;
90 } 90 }
91 91
92 _query_lock = new (std::nothrow) Mutex(Monitor::max_nonleaf, "NMT_queryLock");
93 if (_query_lock == NULL) {
94 shutdown(NMT_out_of_memory);
95 return;
96 }
97
92 debug_only(_main_thread_tid = os::current_thread_id();) 98 debug_only(_main_thread_tid = os::current_thread_id();)
93 _state = NMT_bootstrapping_single_thread; 99 _state = NMT_bootstrapping_single_thread;
94 NMT_track_callsite = (_tracking_level == NMT_detail && can_walk_stack()); 100 NMT_track_callsite = (_tracking_level == NMT_detail && can_walk_stack());
95 } 101 }
96 } 102 }
162 delete_all_pooled_recorders(); 168 delete_all_pooled_recorders();
163 169
164 { 170 {
165 // shared baseline and snapshot are the only objects needed to 171 // shared baseline and snapshot are the only objects needed to
166 // create query results 172 // create query results
167 MutexLockerEx locker(&_query_lock, true); 173 MutexLockerEx locker(_query_lock, true);
168 // cleanup baseline data and snapshot 174 // cleanup baseline data and snapshot
169 _baseline.clear(); 175 _baseline.clear();
170 delete _snapshot; 176 delete _snapshot;
171 _snapshot = NULL; 177 _snapshot = NULL;
172 } 178 }
532 } 538 }
533 } 539 }
534 540
535 // baseline current memory snapshot 541 // baseline current memory snapshot
536 bool MemTracker::baseline() { 542 bool MemTracker::baseline() {
537 MutexLockerEx lock(&_query_lock, true); 543 MutexLockerEx lock(_query_lock, true);
538 MemSnapshot* snapshot = get_snapshot(); 544 MemSnapshot* snapshot = get_snapshot();
539 if (snapshot != NULL) { 545 if (snapshot != NULL) {
540 return _baseline.baseline(*snapshot, false); 546 return _baseline.baseline(*snapshot, false);
541 } 547 }
542 return false; 548 return false;
543 } 549 }
544 550
545 // print memory usage from current snapshot 551 // print memory usage from current snapshot
546 bool MemTracker::print_memory_usage(BaselineOutputer& out, size_t unit, bool summary_only) { 552 bool MemTracker::print_memory_usage(BaselineOutputer& out, size_t unit, bool summary_only) {
547 MemBaseline baseline; 553 MemBaseline baseline;
548 MutexLockerEx lock(&_query_lock, true); 554 MutexLockerEx lock(_query_lock, true);
549 MemSnapshot* snapshot = get_snapshot(); 555 MemSnapshot* snapshot = get_snapshot();
550 if (snapshot != NULL && baseline.baseline(*snapshot, summary_only)) { 556 if (snapshot != NULL && baseline.baseline(*snapshot, summary_only)) {
551 BaselineReporter reporter(out, unit); 557 BaselineReporter reporter(out, unit);
552 reporter.report_baseline(baseline, summary_only); 558 reporter.report_baseline(baseline, summary_only);
553 return true; 559 return true;
555 return false; 561 return false;
556 } 562 }
557 563
558 // compare memory usage between current snapshot and baseline 564 // compare memory usage between current snapshot and baseline
559 bool MemTracker::compare_memory_usage(BaselineOutputer& out, size_t unit, bool summary_only) { 565 bool MemTracker::compare_memory_usage(BaselineOutputer& out, size_t unit, bool summary_only) {
560 MutexLockerEx lock(&_query_lock, true); 566 MutexLockerEx lock(_query_lock, true);
561 if (_baseline.baselined()) { 567 if (_baseline.baselined()) {
562 MemBaseline baseline; 568 MemBaseline baseline;
563 MemSnapshot* snapshot = get_snapshot(); 569 MemSnapshot* snapshot = get_snapshot();
564 if (snapshot != NULL && baseline.baseline(*snapshot, summary_only)) { 570 if (snapshot != NULL && baseline.baseline(*snapshot, summary_only)) {
565 BaselineReporter reporter(out, unit); 571 BaselineReporter reporter(out, unit);