gpt4 book ai didi

java - Executor 创建的线程池会释放内存吗?

转载 作者:行者123 更新时间:2023-11-30 06:31:26 29 4
gpt4 key购买 nike

考虑基本的固定线程池:

Executors.newFixedThreadPool(MaxListeners)

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

然而,当每个任务中的Runnable代码完成时,它们消耗的内存没有被释放?我发现 jvm 内存使用量持续增长。

应用程序倾向于分组处理一组任务。我们可以看到一个阶梯式的内存使用模式:每组任务之后,内存都会增加几十兆字节。即使等待几十分钟(到几小时)也不会导致内存被回收。

有两个问题:

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

最佳答案

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

幸运的是,有一些工具可以帮助您解决此问题。您可以使用分析器来检查哪些对象仍然存在,甚至可以获取有关这些对象的数据。附件是 Netbeans IDE 中默认分析器的示例。它正在分析我的应用程序并显示所有 Activity 的时间轴对象(这就是我关注的重点)。但它可以轻松地向我展示所有物体。这是查看哪些对象导致内存泄漏或只是存活时间过长的快速方法。

enter image description here

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

Objects can be GCed even if there are still references to them. What matters is if there is a chain of strong references to the object from a GC root (thread stack or static variable).

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

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com