2017-03-08 43 views
0

我的應用程序中有幾個泄露的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 
+0

這是一個空閒線程池的典型堆棧轉儲(等待任務出現在隊列中),不幸的是這裏不是很有幫助。堆轉儲和一些內存泄漏分析工具(如[this](http://www.eclipse.org/mat/)?)可能會告訴你哪些代碼擁有/引用了有問題的ScheduledThreadPoolExecutor。我不知道一個簡單的方法來找到信息 – zapl

+1

你是什麼意思「泄漏的線程池」?你遇到的更直接的問題是什麼?像這樣的空閒Java線程並不真正消耗任何計算資源;最糟糕的是,線程對象本身會佔用幾個字節的內存。 –

+0

在3天內,線程池的數量達到32K,導致操作系統問題。沒有我的代碼創建了這麼多的線程,所以我懷疑一些依賴。我會嘗試堆轉儲方法。 – Pratik

回答

0

從線程日誌中可以看出該線程池的線程爲0,需要等待;

一般來說,線程池最好使用自定義名稱,否則定位代碼塊不好;上述情況只能通過從代碼分析實際操作相結合:

  1. 列出所有線程的代碼庫
  2. 結合分析的實際操作中的線程池有很多線程調用
0

使用jstack命令或其他工具執行線程轉儲。 使用TDA(線程轉儲分析器)來檢查等待線程是否在等待哪個線程以及爲什麼持有哪個監視器。

相關問題