docs: public void shutdown() {
  		synchronized (lock) {
  			// first shutdown the thread pool
  			ScheduledExecutorService es = this.executorService;
  			if (es != null) {
  				es.shutdown();
  				try {
  					es.awaitTermination(cleanupInterval, TimeUnit.MILLISECONDS);
  				}
  				catch (InterruptedException e) {
  					// may happen
  				}
  			}
  
  			entries.clear();
  			jobRefHolders.clear();
  
  			// clean up the all storage directories
  			for (File dir : storageDirectories) {
  				try {
  					FileUtils.deleteDirectory(dir);
  					LOG.info("removed file cache directory {}", dir.getAbsolutePath());
  				}
  				catch (IOException e) {
  					LOG.error("File cache could not properly clean up storage directory: {}", dir.getAbsolutePath(), e);
  				}
  			}
  
  			// Remove shutdown hook to prevent resource leaks
  			ShutdownHookUtil.removeShutdownHook(shutdownHook, getClass().getSimpleName(), LOG);
  		}
  	}