Чтобы подвести итоги, перечисленные в комментариях:
Это утечка потока, вызванная методом timeoutAfter()
(см. Источник, который вы указали).
Этот метод создает новый пул потоков с одним потоком каждый раз, когда он вызывается, но нет ничего, чтобы закрыть пул и, следовательно, остановить потоки.
Поскольку timeoutAfter()
вызывается один раз (вероятно) для каждого CompletableFuture
, созданного в createCache()
, общее число потоков просто увеличивается.
Исправление заключается в том, чтобы повторно использовать пулы потоков в течение всего жизненного цикла приложения и убедиться, что они правильно закрыты при выходе (еще одним соображением было бы то, как определить размер пулов потоков и какой тип пулов потоков использовать, особенно если заданные им задачи могут блокироваться).
Также см. Комментарии Натана Хьюза к вопросу.