docs: synchronized void cleanUp() {
  
          updateAccessCounts();
  
          int                          removeCount = size() / 2;
          int accessTarget = getAccessCountCeiling(removeCount, removeCount / 8);
          BaseHashMap.BaseHashIterator it          = new BaseHashIterator();
          int                          savecount   = 0;
  
          for (; it.hasNext(); ) {
              CachedObject r = (CachedObject) it.next();
  
              if (it.getAccessCount() <= accessTarget) {
                  synchronized (r) {
                      if (!r.isKeepInMemory()) {
                          r.setInMemory(false);
  
                          if (r.hasChanged()) {
                              rowTable[savecount++] = r;
                          }
  
                          it.remove();
  
                          cacheBytesLength -= r.getStorageSize();
  
                          removeCount--;
                      }
                  }
              }
          }
  
          if (removeCount > 50) {
              it = new BaseHashIterator();
  
              for (; removeCount >= 0 && it.hasNext(); ) {
                  CachedObject r = (CachedObject) it.next();
  
                  if (!r.isKeepInMemory()) {
                      r.setInMemory(false);
  
                      if (r.hasChanged()) {
                          rowTable[savecount++] = r;
                      }
  
                      it.remove();
  
                      cacheBytesLength -= r.getStorageSize();
  
                      removeCount--;
                  }
              }
          }
  
          super.setAccessCountFloor(accessTarget);
          saveRows(savecount);
      }