Mercurial > hg > graal-jvmci-8
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); |