天天看點

怎樣使用jstack診斷Java應用程式故障(轉)

        最近一段時間,我們的生産系統更新頻繁出現故障,具體故障現象是啟動後10來分鐘就出現交易緩慢,處理線程耗盡等現象,并且故障發生的頻率蠻高的。經過詳細的診斷和排查,終于發現了問題,是groovy在osgi中運作會出現classloader死鎖,最後我們也解決了這個問題。 

        如果單靠通過檢視代碼是很難去發現這個問題,在這一次故障排查中,我也學到了怎樣更好的使用jvm監控工具來進行診斷,主要用到了jstack和jmap指令,jmap上次已經講過就不再講了,下面就一個例子來講怎麼使用jstack來對的Java程式進行診斷。 

        首先讓我們來了解一下jstack這個指令的作用,jstack 是一個可以傳回在應用程式上運作的各種各樣線程的一個完整轉儲的實用程式,您可以使用它查明問題。jstack [-l] <pid>,jpid可以通過使用jps指令來檢視目前Java程式的jpid值,-l是可選參數,它可以顯示線程阻塞/死鎖情況。 

以上DeadLock類是一個死鎖的例子,假使在我們不知情的情況下,運作DeadLock後,發現等了N久都沒有在螢幕列印線程完成資訊。這個時候我們就可以使用jps檢視該程式的jpid值和使用jstack來生産堆棧結果問題。

結果檔案deadlock.jstack内容如下: 

從這個結果檔案我們一看到發現了一個死鎖,具體是線程t2在等待線程t1,而線程t1在等待線程t2造成的,同時也記錄了線程的堆棧和代碼行數,通過這個堆棧和行數我們就可以去檢查對應的代碼塊,進而發現問題和解決問題。

http://crane-ding.iteye.com/blog/968862