jstack是個好東西

產品中使用了 ThreadPoolExecutor創建線程池,遇到兩個不夠熟悉的地方,記錄一下

1.coresize是線程池的初始化容量,當加入線程池的任務超過coresize時,首先是向等待隊列中增加任務,當隊列加滿後,纔會繼續新建線程,但是數量不能超過maxpoolsize。

2.我們的多線程任務在執行幾天之後會出現activecount一直無法降爲0的狀況,也就是說有幾個線程一直處於掛起狀態,佔用資源,如果這種情況持續增加,會把線程池佔滿,那時系統將崩潰。

這個問題的出現,會有很多原因,首先檢查的是數據庫是否發生鎖表或行級鎖,是否有文件資源被佔用導致死鎖。各種情況均排除之後,問題依然得不到解決。找資料,發現jstack可以查看jvm的線程情況。通過jstack pid 發現


"pool-6-thread-19" #219 prio=5 os_prio=0 tid=0x00007f47d8073800 nid=0x6478 runnable [0x00007f4791fe2000]
   java.lang.Thread.State: RUNNABLE
	at java.net.SocketInputStream.socketRead0(Native Method)
	at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
	at java.net.SocketInputStream.read(SocketInputStream.java:171)
	at java.net.SocketInputStream.read(SocketInputStream.java:141)
	at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
	at sun.security.ssl.InputRecord.read(InputRecord.java:503)
	at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:975)
	- locked <0x00000000882db928> (a java.lang.Object)
	at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:933)
	at sun.security.ssl.AppInputStream.read(AppInputStream.java:105)
	- locked <0x00000000882dba50> (a sun.security.ssl.AppInputStream)
	at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
	at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
	at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
	- locked <0x00000000882dba68> (a java.io.BufferedInputStream)
	at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:735)
	at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1587)
	- locked <0x00000000882dbac0> (a sun.net.www.protocol.https.DelegateHttpsURLConnection)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
	- locked <0x00000000882dbac0> (a sun.net.www.protocol.https.DelegateHttpsURLConnection)
	at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:263)
	- locked <0x00000000882dbc50> (a sun.net.www.protocol.https.HttpsURLConnectionImpl)
	at com.aim.insurance.service.archive.manager.ShangQiManager.post(ShangQiManager.java:274)
	at com.aim.insurance.service.archive.manager.ShangQiManager.carInquiry(ShangQiManager.java:127)
	at com.aim.insurance.service.inquiry.manager.InquiryManager.asyncInquiry(InquiryManager.java:293)
	at com.aim.insurance.service.inquiry.manager.InquiryManager$1.processBusinessLogic(InquiryManager.java:277)
	at com.aim.insurance.service.common.AsyncTask.run(AsyncTask.java:35)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

排查到HttpURLConnection在調用http接口的時候掛起了,檢查代碼,沒有設置連接超時時間和讀取超時時間,導致線程block阻塞。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章