docs: protected synchronized void evictStaleEntries() {
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
              int size = primaryTable.size() + secondaryTable.size() + tertiaryTable.size();
              Tr.debug(tc, "The current cache size is " + size + "( " + primaryTable.size() + ", " + secondaryTable.size() + ", " + tertiaryTable.size() + ")");
          }
  
          ConcurrentHashMap<Object, Object> victims = tertiaryTable;
  
          tertiaryTable = secondaryTable;
          secondaryTable = primaryTable;
          primaryTable = new ConcurrentHashMap<Object, Object>((minSize > secondaryTable.size()) ? minSize : secondaryTable.size());
  
          if (victims.isEmpty() == false) {
              List<Object> evictedValues = new ArrayList<Object>();
              Iterator<Object> iterator = victims.values().iterator();
              while (iterator.hasNext()) {
                  Entry entry = (Entry) iterator.next();
                  if (entry.value != null) {
                      evictedValues.add(entry.value);
                  }
              }
  
              for (CacheEvictionListener evictionCallback : cacheEvictionListenerSet) {
                  evictionCallback.evicted(evictedValues);
              }
          }
      }