如何在应用程序中找到泄漏的threadPools的来源

时间:2017-03-08 01:41:49

标签: java multithreading debugging java-8

我的应用程序中有几个泄露的ThreadPools。这些泄露的threadPools没有任何特定的名称,并使用java的默认命名约定。我们的应用程序启动的所有ThreadPool都有特定于应用程序的名称。它看起来有些依赖库正在启动这些threadPools。我能够重现这一点,但需要帮助我如何找到启动这些threadPools的代码。任何帮助深表感谢。 从应用程序stackDump堆栈泄漏的ThreadPool转储。所有线程都处于相同的状态。

"pool-11-thread-1" #23 prio=5 os_prio=0 tid=0x00007f9f0c179000 nid=0x12db 
 waiting on condition [0x00007f9f2effa000]
 java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x000000008858c608>
 (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215) 
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

Locked ownable synchronizers: - None

2 个答案:

答案 0 :(得分:0)

从线程日志中可以看到该线程池的线程为0,需要等待;

一般情况下,线程池最好使用自定义名称或错误的定位代码块;以上情况只能与代码分析中的实际操作相结合:

  1. 列出代码中的所有线程池
  2. 结合实际操作分析哪个线程池有很多线程调用

答案 1 :(得分:0)

使用jstack命令或其他工具进行线程转储。 使用TDA(线程转储分析器)检查等待线程正在等待哪个监视器保持哪个线程以及原因。