          };
  
  ////////////////////////////////////////////////////////////////////////////////
-@@ -306,6 +318,18 @@ namespace triagens {
+@@ -241,6 +253,12 @@ namespace triagens {
+ ////////////////////////////////////////////////////////////////////////////////
+ 
+ ////////////////////////////////////////////////////////////////////////////////
++/// @brief determine which of the free contexts should be picked for the GC
++////////////////////////////////////////////////////////////////////////////////
++
++        V8Context* pickContextForGc ();
++
++////////////////////////////////////////////////////////////////////////////////
+ /// @brief prepares a V8 instance
+ ////////////////////////////////////////////////////////////////////////////////
+ 
+@@ -312,6 +330,18 @@ namespace triagens {
          uint64_t _gcInterval;
  
  ////////////////////////////////////////////////////////////////////////////////

 
       if (_dirtyContexts.empty()) {
-        guard.wait();
+        // check whether we got a wait timeout or a signal
+        gotSignal = guard.wait(waitTime);
       }
 
       if (! _dirtyContexts.empty()) {
         context = _dirtyContexts.back();
         _dirtyContexts.pop_back();
       }
+
+      if (context == 0 && ! gotSignal && ! _freeContexts.empty()) {
+        // we timed out waiting for a signal
+        // so we'll pop one of the free contexts and clean it up pro-actively
+        context = _freeContexts.back();
+        if (context != 0) {
+          _freeContexts.pop_back();
+        }
+      }
     }
+   
+    // update last gc time   

 
     if (context != 0) {
       LOGGER_TRACE << "collecting V8 garbage";
@@ -288,6 +414,7 @@ void ApplicationV8::collectGarbage () {
       delete context->_locker;
 
       context->_dirt = 0;
