为了账号安全,请及时绑定邮箱和手机立即绑定

Java 线程数量随时间增长的原因

Java 线程数量随时间增长的原因

喵喵时光机 2021-07-08 18:13:55
我有一个独立的 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)我不明白他们是什么。你能帮我找出什么代码一次又一次地创建新线程吗?有什么好工具吗?
查看完整描述

2 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

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


//img1.sycdn.imooc.com//6102605b0001827408180679.jpg

查看完整回答
反对 回复 2021-07-29
  • 2 回答
  • 0 关注
  • 351 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信