src/share/vm/services/memTracker.cpp

changeset 4810
06db4c0afbf3
parent 4512
4102b59539ce
child 4890
4c8bb5e4f68f
     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());

mercurial