【问题标题】:Deduce why threads have increased in java application推断java应用程序中线程增加的原因
【发布时间】:2018-03-02 02:33:45
【问题描述】:

上下文
我在服务器上有一个指标,可以发布我在任何给定时间拥有的线程数量。在最近的一次部署中,我注意到线程数平均增加了大约 30 个线程(最初停滞在 370 个左右,现在一直保持在 400 个线程)。

我做了什么
有许多软件包/可能性可能是这种增加的根本原因。这就是为什么我研究分析线程的原因。我学会了如何获取和获取线程转储,但我看不到任何有用的信息,说明为什么创建这些线程/如何使用它们。

我的服务没有受到负面影响(延迟/CPU/内存),但我仍然想从根本上解决这个问题,因为它可能是内存泄漏的原因。

我的问题
如果有一些资源能够获取创建线程的类/包,那将非常有帮助(我已经在网上搜索了一段时间以寻找类似的资源)。

非常感谢任何有关根本原因的建议!

【问题讨论】:

  • 第三方库创建的线程通常有一些前缀表明它们的来源。您看到的线程的名称是什么?有规律吗?
  • 感谢您的评论,我刚刚注意到每个线程都有一个描述符。它有点冗长,所以我最初认为它是别的东西。

标签: java multithreading concurrency threadpool


【解决方案1】:

寻找话题来源

如果您还没有直接处理线程,请使用 Java Executors。如果您使用 Executors,您可以为线程池中的线程定义名称。这些名称包含在您的 java 进程的线程转储中。因此,如果一个线程具有您自定义的名称之一,您将知道哪个线程池创建了它。通常的做法是为应用程序中不同类型的任务维护不同的线程池,并为每个池中的线程赋予不同的名称。这样,当您进行线程转储时,您可以确定应用程序的每个部分正在创建多少线程。请参阅this question 了解如何定义自定义线程名称。

如何限制线程

ThreadPoolExecutor 允许您定义最大数量 池中的线程。因此,如果您知道您正在使用的所有池以及它们的最大大小是多少,您应该能够定义可以在您的应用程序中运行的最大并发线程数。

您可能需要特别注意服务器、客户端和网络库,因为它们可能会创建自己的线程。库通常也会为其线程命名,因此您可能可以在线程转储中搜索一个不熟悉的名称或堆栈跟踪,以找出它的来源。

【讨论】:

    猜你喜欢
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 2021-02-24
    相关资源
    最近更新 更多