为什么Java线程数量及时增长的原因

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么Java线程数量及时增长的原因相关的知识,希望对你有一定的参考价值。

我有一个独立的Java控制台程序,它在生产中使用大约80-170(160是平均负载下的典型数字)线程。在项目中替换了一些代码,这些代码在功能上很好但是在启动程序后线程数不断增加。当虚拟机几乎崩溃时,我意识到了这个问题。然后它有30.000个线程。

我想在生产环境中找到这种行为的原因,所以如果有任何有用的工具,它必须是命令行程序或者应该能够从远程主机运行。

我用'ps huH p |检查了它wc -l'命令和VisualVm程序。遗憾的是VisualVm远程提供有关线程编号的信息,“线程”选项卡不活动

我试图从jstack命令获取有用的信息,但我找不到创建等的新线程是什么

"Timer-459" #1864 daemon prio=10 os_prio=0 tid=0x0bb6c400 nid=0x3c4f in Object.wait() [0x2a980000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:502)
    at java.util.TimerThread.mainLoop(Timer.java:526)
    - locked <0x4d18bc80> (a java.util.TaskQueue)
    at java.util.TimerThread.run(Timer.java:505)

要么

"pool-133-thread-2" #1877 prio=5 os_prio=0 tid=0x42a2c400 nid=0x3e5e waiting on condition [0x2b118000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x4d18ae80> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

我不知道他们是什么。

你能帮帮我怎样才能找出一次又一次创建新线程的代码?有什么好工具吗?

谢谢!

答案

我会说jstack是这种任务的正确工具。您可以通过堆栈跟踪和源代码了解线程性质。例如。 at java.util.TimerThread.mainLoop(Timer.java:526)表示您的代码使用Timer类,其线程正在等待下一个计划。 java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)表示您使用ExecutorService实现之一,其工作线程正在等待下一个任务。尝试分析有多少线程池线程存在以及为什么,可能它们是您的问题的根源。

另一答案

只要CPU记录处于活动状态,JProfiler中的线程监视器视图就可以显示创建任何线程的堆栈跟踪。

enter image description here

免责声明:我公司开发JProfiler。

以上是关于为什么Java线程数量及时增长的原因的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程安全可见性和有序性之Volatile

什么是在 C++ 中获取总内核数量的跨平台代码片段? [复制]

线程安全性

为啥片段类应该是公开的?

为啥尽管源代码没有变化,但从一个系统到另一个系统的片段数量却有很大差异?

IDEA对新建java线程池的建议