推断为什么线程在java应用程序中增加了

时间:2018-03-02 02:33:46

标签: java multithreading concurrency threadpool

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

我做了什么
有许多包/可能性可能是这种增加的根本原因。这就是我研究分析线程的原因。我学会了如何获得并获得了一个线程转储但我无法看到有关为什么创建这些线程/如何使用它们的任何有用信息。

我的服务没有受到负面影响(延迟/ CPU /内存)但我仍然希望根本导致此问题,因为它可能是内存泄漏的理由。

我的问题
如果有一些资源能够获得创建该线程的类/包,那将非常有用(我已经在线搜索了一段时间用于这样的资源)。

对root的任何建议都非常感谢!

1 个答案:

答案 0 :(得分:0)

查找主题来源

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

如何限制线程

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

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