我正在使用Spring,在一种RequestMap方法中,我的代码如下:
RequestMap
@RequestMap public void someMethod() { ThreadPoolExecutor executor = Executors.newFixedThreadPool(N); executor.submit(new Runnable()); executor.submit(new Runnable()); }
然后,即使每秒钟都Runnable应该完成,我仍然会收到OOM错误。分析堆转储后,我发现有数千个Thread对象。
Runnable
Thread
然后我改为executor,使用singlton Executors.newCachedThreadPool,此问题已解决。
executor
Executors.newCachedThreadPool
据我了解,该方法返回后,没有对线程池的引用,因此应该对其进行垃圾回收,但事实是线程仍在堆上。为什么?
是的,这会泄漏内存。如文档中所述:
ExecutorService应该关闭未使用的资源,以回收其资源。
ExecutorService
关闭执行程序(executor.shutdown()),或重新使用它。
executor.shutdown()