docs: @Override
    public void close() {
      if (isDefaultManager() && getClass().getClassLoader() == classLoader) {
        log.info("Closing default CacheManager");
      }
      Iterable<Cache> _caches;
      synchronized (lock) {
        if (closing) {
          return;
        }
        _caches = cachesCopy();
        closing = true;
      }
      logPhase("close");
      List<Throwable> _suppressedExceptions = new ArrayList<Throwable>();
      for (Cache c : _caches) {
        ((InternalCache) c).cancelTimerJobs();
      }
      for (Cache c : _caches) {
        try {
          c.close();
        } catch (Throwable t) {
          _suppressedExceptions.add(t);
        }
      }
      try {
        for (CacheManagerLifeCycleListener lc : cacheManagerLifeCycleListeners) {
          lc.managerDestroyed(this);
        }
      } catch (Throwable t) {
        _suppressedExceptions.add(t);
      }
      ((Cache2kCoreProviderImpl) PROVIDER).removeManager(this);
      synchronized (lock) {
        for (Cache c : cacheNames.values()) {
          log.warn("unable to close cache: " + c.getName());
        }
      }
      eventuallyThrowException(_suppressedExceptions);
      cacheNames = null;
    }