Currently the ExecutorService used for this is as such: ExecutorService executorService = new ThreadPoolExecutor(0, Integer.MAX_VALUE, Long.MAX_VALUE, TimeUnit.MILLISECONDS, new SynchronousQueue<>(), new AsyncIOThreadFactory()); This means that the threads never terminate and are spawned whenever a thread is not available, which for a server under a spike of load spawns many threads which never exit, consuming system resources indefinitely. I would suggest that a saner idle timeout than Long.MAX_VALUE should be used, such as 60 seconds, unless there is a good reason I am unaware of as to why such threads should never die.
See: https://github.com/apache/tomcat/pull/612/files
Fixed in: - 11.0.x for 11.0.0-M6 onwards - 10.1.x for 10.1.9 onwards - 9.0.x for 9.0.75 onwards - 8.5.x for 8.5.89 onwards