code: protected void evict() {
          lock.lock();
  
          Map<K, E> removingObjects = null;
          try {
              for (Map.Entry<K, E> entry : pool.entrySet()) {
                  if (entry.getValue().activityPrint().isExpired()) {
                      if (removingObjects == null) {
                          removingObjects = Objectory.createMap();
                      }
  
                      removingObjects.put(entry.getKey(), entry.getValue());
                  }
              }
  
              if (N.notNullOrEmpty(removingObjects)) {
                  for (K key : removingObjects.keySet()) {
                      E e = pool.remove(key);
  
                      if (logger.isInfoEnabled()) {
                          logger.info("Evicting expired cached object. KEY: " + key + ", VALUE: " + N.toString(e) + ". Activity print: " + e.activityPrint());
                      }
  
                  }
  
                  destroyObject(removingObjects);
  
                  notFull.signalAll();
              }
          } finally {
              lock.unlock();
  
              Objectory.recycle(removingObjects);
          }
      }
docs: scan the object pool to find the idle object which inactive time greater than permitted the inactive time for it
  or it's time out.