Java问题排查工具箱
http://hellojava.info/
問題排查除了最重要的解決思路和邏輯推導能力外,工具也是不可缺少的一部分,一個好用的工具可以事半功倍,甚至在某些情況下會因為沒有相應的工具而壓根就沒法繼續進行下去,這篇文章就來講講在排查Java問題時通常要用到的一些工具(ps:這種文章值得收藏,看一遍其實很容易忘)。
日志相關工具
查問題的時候會非常依賴日志,因此看日志的相關工具非常重要,通常的話掌握好tail,find,fgrep,awk這幾個常用工具的方法就可以,說到這個就必須說關鍵的異常和信息日志輸出是多么的重要(看過太多異常的隨意處理,例如很典型的是應用自己的ServletContextListener實現,很多的Listener實現都會變成往外拋RuntimeException,然后直接導致tomcat退出,而tomcat這個時候也不會輸出這個異常信息,這種時候要查原因真的是讓人很郁悶,盡管也有辦法)。
日志的標準化也非常重要,日志的標準化一方面方便像我這種要查各種系統問題的人,不標準的話連日志在哪都找不到;另一方面對于分布式系統而言,如果標準化的話是很容易做日志tracing的,對問題定位會有很大幫助。
CPU相關工具
碰到一些CPU相關的問題時,通常需要用到的工具:
top (-H)
top可以實時的觀察cpu的指標狀況,尤其是每個core的指標狀況,可以更有效的來幫助解決問題,-H則有助于看是什么線程造成的CPU消耗,這對解決一些簡單的耗CPU的問題會有很大幫助。
sar
sar有助于查看歷史指標數據,除了CPU外,其他內存,磁盤,網絡等等各種指標都可以查看,畢竟大部分時候問題都發生在過去,所以翻歷史記錄非常重要。
jstack
jstack可以用來查看Java進程里的線程都在干什么,這通常對于應用沒反應,非常慢等等場景都有不小的幫助,jstack默認只能看到Java棧,而jstack -m則可以看到線程的Java棧和native棧,但如果Java方法被編譯過,則看不到(然而大部分經常訪問的Java方法其實都被編譯過)。
pstack
pstack可以用來看Java進程的native棧。
perf
一些簡單的CPU消耗的問題靠著top -H + jstack通常能解決,復雜的話就需要借助perf這種超級利器了。
cat /proc/interrupts
之所以提這個是因為對于分布式應用而言,頻繁的網絡訪問造成的網絡中斷處理消耗也是一個關鍵,而這個時候網卡的多隊列以及均衡就非常重要了,所以如果觀察到cpu的si指標不低,那么看看interrupts就有必要了。
內存相關工具
碰到一些內存相關的問題時,通常需要用到的工具:
jstat
jstat -gcutil或-gc等等有助于實時看gc的狀況,不過我還是比較習慣看gc log。
jmap
在需要dump內存看看內存里都是什么的時候,jmap -dump可以幫助你;在需要強制執行fgc的時候(在CMS GC這種一定會產生碎片化的GC中,總是會找到這樣的理由的),jmap -histo:live可以幫助你(顯然,不要隨便執行)。
gcore
相比jmap -dump,其實我更喜歡gcore,因為感覺就是更快,不過由于某些jdk版本貌似和gcore配合的不是那么好,所以那種時候還是要用jmap -dump的。
mat
有了內存dump后,沒有分析工具的話然并卵,mat是個非常贊的工具,好用的沒什么可說的。
btrace
少數的問題可以mat后直接看出,而多數會需要再用btrace去動態跟蹤,btrace絕對是Java中的超級神器,舉個簡單例子,如果要你去查下一個運行的Java應用,哪里在創建一個數組大小>1000的ArrayList,你要怎么辦呢,在有btrace的情況下,那就是秒秒鐘搞定的事,:)
gperf
Java堆內的內存消耗用上面的一些工具基本能搞定,但堆外就悲催了,目前看起來還是只有gperf還算是比較好用的一個,或者從經驗上來說Direct ByteBuffer、Deflater/Inflater這些是常見問題。
除了上面的工具外,同樣內存信息的記錄也非常重要,就如日志一樣,所以像GC日志是一定要打開的,確保在出問題后可以翻查GC日志來對照是否GC有問題,所以像-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:?這樣的參數必須是啟動參數的標配。
ClassLoader相關工具
作為Java程序員,不碰到ClassLoader問題那基本是不可能的,在排查此類問題時,最好辦的還是-XX:+TraceClassLoading,或者如果知道是什么類的話,我的建議就是把所有會裝載的lib目錄里的jar用jar -tvf *.jar這樣的方式來直接查看沖突的class,再不行的話就要呼喚btrace神器去跟蹤Classloader.defineClass之類的了。
其他工具
jinfo
Java有N多的啟動參數,N多的默認值,而任何文檔都不一定準確,只有用jinfo -flags看到的才靠譜,甚至你還可以看看jinfo -flag,你會發現更好玩的。
dmesg
你的java進程突然不見了? 也許可以試試dmesg先看看。
systemtap
有些問題排查到java層面是不夠的,當需要trace更底層的os層面的函數調用的時候,systemtap神器就可以派上用場了。
gdb
更高級的玩家們,拿著core dump可以用gdb來排查更詭異的一些問題。
io類型的問題我排查的很少,所以盡管知道一些工具,還是不在這里寫了。
暫時就寫這些,盡管工具的使用多數都可以臨時學,但首先知道有哪些工具是最重要的,然后呢還是建議大家可以玩一玩這些工具,這樣以后真的要用的時候也不至于一點印象都沒有。
轉載于:https://www.cnblogs.com/davidwang456/articles/9444285.html
總結
以上是生活随笔為你收集整理的Java问题排查工具箱的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从零开始Code Review
- 下一篇: 利用solr的 DataImportHa