void BufferManager::cleanUpNonReferencedBuffers(JNIEnv *jenv, bool enforce) {
   if (! enforce && ! replacedAparapiBuffer && ! replacedArrayBuffer) return;
   
   if (enforce || replacedAparapiBuffer) {
      for (std::vector<AparapiBuffer*>::iterator bufferIt = aparapiBufferList.begin(); bufferIt != aparapiBufferList.end(); bufferIt++) {
         AparapiBuffer* buffer = *bufferIt;
         if (! (buffer->hasReferences())) {
            cleanUp(*bufferIt, jenv);
            bufferIt = aparapiBufferList.erase(bufferIt);

            // erase returns the a new iterator, pointing to the next element.
            // for the last element, we point to .end(), on which incrementing
            // is invalid!
            if (bufferIt == aparapiBufferList.end()) break;
         }
      }
   }

   if (enforce || replacedArrayBuffer) {
      for (std::vector<ArrayBuffer*>::iterator bufferIt = arrayBufferList.begin(); bufferIt != arrayBufferList.end(); bufferIt++) {
         ArrayBuffer* buffer = *bufferIt;
         if (! (buffer->hasReferences())) {
            cleanUp(buffer, jenv);
            bufferIt = arrayBufferList.erase(bufferIt);

            // erase returns the a new iterator, pointing to the next element.
            // for the last element, we point to .end(), on which incrementing
            // is invalid!
            if (bufferIt == arrayBufferList.end()) break;
         }
      }
   }
   
   replacedAparapiBuffer = false;
   replacedArrayBuffer = false;
}