我的應用程序中有幾個泄露的ThreadPools。這些泄漏的threadPools沒有任何特定的名稱,並使用java的默認命名約定。我們的應用程序啓動的所有ThreadPool都具有應用程序特定的名稱。它看起來有些依賴庫正在啓動這些threadPools。我能夠重現這一點,但需要幫助我如何找到啓動這些threadPools的代碼。任何幫助深表感謝。 從應用程序stackDump中釋放泄露的ThreadPool的堆棧。所有線程都處於相同狀態。如何在應用程序中找到泄露的threadPools的源碼
"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
這是一個空閒線程池的典型堆棧轉儲(等待任務出現在隊列中),不幸的是這裏不是很有幫助。堆轉儲和一些內存泄漏分析工具(如[this](http://www.eclipse.org/mat/)?)可能會告訴你哪些代碼擁有/引用了有問題的ScheduledThreadPoolExecutor。我不知道一個簡單的方法來找到信息 – zapl
你是什麼意思「泄漏的線程池」?你遇到的更直接的問題是什麼?像這樣的空閒Java線程並不真正消耗任何計算資源;最糟糕的是,線程對象本身會佔用幾個字節的內存。 –
在3天內,線程池的數量達到32K,導致操作系統問題。沒有我的代碼創建了這麼多的線程,所以我懷疑一些依賴。我會嘗試堆轉儲方法。 – Pratik