为什么每个用户请求线程都会启动那么多Java守护线程?

huangapple 未分类评论45阅读模式
英文:

Why so many java daemon threads starts for each user request thread?

问题

最近,由于资源不足,Linux 主机出现了服务不可用的情况。在进一步的调查中,我发现为一个 JVM 实例启动了过多的线程,多达 3000 多个线程...

经过一些测试,我发现每次访问都会创建许多名为 'hystrix-' 的守护线程,即使用户线程已关闭,这些启动的守护线程也没有关闭。jstack PID 结果如下:

2020-04-09 14:42:14
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.171-b11 mixed mode):

"hystrix-dcpms-service-biz-flow-20" #124 daemon prio=5 os_prio=0 tid=0x00007fc44c083800 nid=0x70a9 waiting on condition [0x00007fc43f6eb000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000000e59870c8> (a java.util.concurrent.SynchronousQueue$TransferStack)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:458)
        at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
        at java.util.concurrent.SynchronousQueue.take(SynchronousQueue.java:924)
        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)

"hystrix-dcpms-service-incidence-relation-6" #123 daemon prio=5 os_prio=0 tid=0x00007fc44819c800 nid=0x70a3 waiting on condition [0x00007fc43f7ec000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000000ff9c20d8> (a java.util.concurrent.SynchronousQueue$TransferStack)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:458)
        at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
        at java.util.concurrent.SynchronousQueue.take(SynchronousQueue.java:924)
        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)

请问有人能够帮助解决这个问题吗?非常感谢。

英文:

Recently, linux host run out of service due to lack of resources. And in further investigation, I found too many threads started for a JVM instance, as many as over 3000 threads...
After some testing, I found many 'hystrix-' named daemon threads created for each access, and even user thread had been closed, these started daemon threads did not close. The jstack PID result shows below:

2020-04-09 14:42:14
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.171-b11 mixed mode):

&quot;hystrix-dcpms-service-biz-flow-20&quot; #124 daemon prio=5 os_prio=0 tid=0x00007fc44c083800 nid=0x70a9 waiting on condition [0x00007fc43f6eb000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  &lt;0x00000000e59870c8&gt; (a java.util.concurrent.SynchronousQueue$TransferStack)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:458)
        at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
        at java.util.concurrent.SynchronousQueue.take(SynchronousQueue.java:924)
        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)

&quot;hystrix-dcpms-service-incidence-relation-6&quot; #123 daemon prio=5 os_prio=0 tid=0x00007fc44819c800 nid=0x70a3 waiting on condition [0x00007fc43f7ec000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  &lt;0x00000000ff9c20d8&gt; (a java.util.concurrent.SynchronousQueue$TransferStack)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:458)
        at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
        at java.util.concurrent.SynchronousQueue.take(SynchronousQueue.java:924)
        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)

Can anyone please kindly help to reslove this problem? appreciate it very much.

huangapple
  • 本文由 发表于 2020年4月9日 14:54:31
  • 转载请务必保留本文链接:https://java.coder-hub.com/61115506.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定