【问题标题】:Java resident memory growing when Executors.newCachedThreadPool used使用 Executors.newCachedThreadPool 时 Java 常驻内存增长
【发布时间】:2019-12-10 18:08:39
【问题描述】:

我正在使用Executors.newCachedThreadPool() 来处理客户端 api 请求。当平均 10tps 流量时,java 进程的驻留内存似乎随着时间的推移而增长,并且没有减少。另外在看thread id的时候,也说明线程没有被复用。有什么解决方案。我正在使用 Java 7。

【问题讨论】:

  • 也许线程没有被重用,因为执行的实际任务没有完成所以线程没有返回到池中?没有得到更多信息,我们只能猜测。
  • 请阅读“如何创建minimal reproducible example”。然后使用edit 链接改进您的问题(不要通过 cmets 添加更多信息)。否则我们无法回答您的问题并为您提供帮助。
  • 任何理想的线程都将在闲置 60 秒后收获。如果您在此期间提交任何新任务,该线程将被重用。请提供更多数据。
  • 池中的每个线程都向activemq发送消息,似乎去掉activemq消息发送功能后,内存没有增长,线程被重用了。
  • 这可能是由于长时间运行的任务,不建议长时间运行的任务缓存池

标签: java threadpool executorservice


【解决方案1】:

我会记录任务何时开始和完成,因为您似乎有越来越多的线程。我会尝试使用相对较小的固定大小的池来确保它们被重用,并且它会显示您是否有导致资源泄漏的错误。

我也会考虑使用最新版本的 Java,例如 8 或 11,尽管我认为在这种情况下不会有什么不同。

【讨论】:

    猜你喜欢
    • 2014-11-20
    • 2023-03-09
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 2013-09-08
    • 2020-03-02
    相关资源
    最近更新 更多