1.1 --- a/src/share/vm/services/memTracker.cpp Wed Mar 20 08:17:55 2013 +0100 1.2 +++ b/src/share/vm/services/memTracker.cpp Wed Mar 20 09:42:48 2013 -0400 1.3 @@ -68,6 +68,7 @@ 1.4 volatile jint MemTracker::_pooled_recorder_count = 0; 1.5 volatile unsigned long MemTracker::_processing_generation = 0; 1.6 volatile bool MemTracker::_worker_thread_idle = false; 1.7 +volatile bool MemTracker::_slowdown_calling_thread = false; 1.8 debug_only(intx MemTracker::_main_thread_tid = 0;) 1.9 NOT_PRODUCT(volatile jint MemTracker::_pending_recorder_count = 0;) 1.10 1.11 @@ -364,6 +365,12 @@ 1.12 } 1.13 1.14 if (thread != NULL) { 1.15 + // slow down all calling threads except NMT worker thread, so it 1.16 + // can catch up. 1.17 + if (_slowdown_calling_thread && thread != _worker_thread) { 1.18 + os::yield_all(); 1.19 + } 1.20 + 1.21 if (thread->is_Java_thread() && ((JavaThread*)thread)->is_safepoint_visible()) { 1.22 JavaThread* java_thread = (JavaThread*)thread; 1.23 JavaThreadState state = java_thread->thread_state(); 1.24 @@ -442,6 +449,7 @@ 1.25 #define MAX_SAFEPOINTS_TO_SKIP 128 1.26 #define SAFE_SEQUENCE_THRESHOLD 30 1.27 #define HIGH_GENERATION_THRESHOLD 60 1.28 +#define MAX_RECORDER_THREAD_RATIO 30 1.29 1.30 void MemTracker::sync() { 1.31 assert(_tracking_level > NMT_off, "NMT is not enabled"); 1.32 @@ -487,6 +495,13 @@ 1.33 pending_recorders = _global_recorder; 1.34 _global_recorder = NULL; 1.35 } 1.36 + 1.37 + // see if NMT has too many outstanding recorder instances, it usually 1.38 + // means that worker thread is lagging behind in processing them. 1.39 + if (!AutoShutdownNMT) { 1.40 + _slowdown_calling_thread = (MemRecorder::_instance_count > MAX_RECORDER_THREAD_RATIO * _thread_count); 1.41 + } 1.42 + 1.43 // check _worker_thread with lock to avoid racing condition 1.44 if (_worker_thread != NULL) { 1.45 _worker_thread->at_sync_point(pending_recorders, InstanceKlass::number_of_instance_classes());