我的应用程序中有几个泄露的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
答案 0 :(得分:0)
从线程日志中可以看到该线程池的线程为0,需要等待;
一般情况下,线程池最好使用自定义名称或错误的定位代码块;以上情况只能与代码分析中的实际操作相结合:
答案 1 :(得分:0)
使用jstack命令或其他工具进行线程转储。 使用TDA(线程转储分析器)检查等待线程正在等待哪个监视器保持哪个线程以及原因。