code: public synchronized int cleanUpObsoleteEntries() {
          countPutCountSinceEviction = 0;
          nextCleanUpTimestamp = 0;
  
          int countCleaned = 0;
          long timeLimit = isExpiring ? System.currentTimeMillis() - expirationMillis : 0;
          Iterator<CacheEntry<VALUE>> iterator = values.values().iterator();
          while (iterator.hasNext()) {
              CacheEntry<VALUE> cacheEntry = iterator.next();
              if (!isStrongReference && cacheEntry.reference == null) {
                  countRefCleared++;
                  countCleaned++;
                  iterator.remove();
              } else if (cacheEntry.timeCreated < timeLimit) {
                  countExpired++;
                  countCleaned++;
                  iterator.remove();
              }
          }
          return countCleaned;
      }
docs: Iterates over all entries to check for obsolete ones (time expired or reference cleared).
  <p/>
  Note: Usually you don't need to call this method explicitly, because it is called internally in certain
  conditions when space has to be reclaimed.