考虑基本的fixed线程池:

Executors.newFixedThreadPool(MaxListeners)


我打算不断提交新任务-响应传入的tcp套接字服务请求。

但是,似乎每个任务中的Runnable代码完成时-他们消耗的内存没有释放?我看到jvm内存使用量持续增长。

该应用程序倾向于按组处理一组任务。我们可以看到阶梯式内存使用模式:在完成每组任务之后,内存要高出几十兆字节。即使等待数十分钟(至数小时)也不会导致内存回收。

有两个问题:


有没有办法在不关闭线程池的情况下回收Executors线程池的内存
如果不是,那么如何使用现有的java.util[.concurrent]包设计长期运行的线程池?

最佳答案

Java对象不会被垃圾回收,直到这些对象没有引用为止。不要将其视为线程问题,而应将其视为对象引用问题。也就是说,找出哪些生物仍在引用该数据。

幸运的是,有一些工具可以帮助您。您可以使用探查器检查哪些对象仍然存在,甚至可以获取有关这些对象的数据。随附的是Netbeans IDE中默认探查器的示例。它正在分析我的应用程序并显示所有活动的Timeline对象(这就是我关注的重点)。但这很容易向我展示了所有对象。这是查看哪些对象导致内存泄漏或存活时间太长的快速方法。

java - 执行程序创建的线程池是否释放过内存?-LMLPHP

编辑:请注意,@ JBNIzet指出。


  即使仍有引用,也可以对对象进行GC。重要的是,是否有来自GC根(线程堆栈或静态变量)的对象的强引用链。


注意这一点非常重要,因为如果需要删除对该对象的所有引用,则大多数事情将永远不会被清除。

关于java - 执行程序创建的线程池是否释放过内存?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46015880/

10-10 16:53