天天看點

Java應用線上問題排查的常用工具和方法 1、jstack2、jstat3、jmap 1、MAT(Eclipse Memory Analyzer) 2、top3、HouseMD4、TBJMap5、tsar

在長期排查線上問題的過程中,總結了一些工具的用法和排查問題的思路,這裡跟大家分享一下,在遇到類似的問題時,希望能給予一些幫助。

首先講講工具,JVM自帶的一些工具是必須熟練掌握的,例如jstack, jmap, jstat等,它們可以幫我們去深入了解JVM正在做的事情,主要的适用領域有這些:

jstack可以告訴你目前所有JVM線程正在做什麼,包括使用者線程和虛拟機線程,你可以用它來檢視線程棧,并且結合Lock資訊來檢測是否發生了死鎖和死鎖的線程。 沒事兒jstack一下,知道你的小夥伴正在做什麼。 ​另外在用top -H看到占用CPU非常高的pid時,可以轉換成16進制後在jstack dump出來的檔案中搜尋,看看到底是什麼線程占用了CPU。
stat,顧名思義就是提供一些統計資訊,它可以告訴你目前的GC情況,包括GC次數、時間,具體的GC還可以結合gc.log檔案去分析。 一般來說,我們用jstat去檢視GC情況,判斷是否存在YGC或FGC頻繁的情況,再去看gc.log和jamp dump記憶體,MAT分析來定位問題(後面會有一個case針對這種場景)。 常用的用法是jstat -gcutil pid time_interval
排查GC問題必然會用到的工具,jmap可以告訴你目前JVM記憶體堆中的對象分布及其關系,當你dump堆之後可以用MAT分析,看看有哪些大對象,或者哪些類的執行個體特别多。 常用用法: 強制FGC:-histo:live dump堆:-dump:[live],format=b,file=dump.bin 檢視各代記憶體占用情況:-heap

然後我們來介紹一些開源的工具,來增強JVM工具本身的作用。

GC分析必備,用于分析jmap或OOM時dump出來的記憶體快照,可以看到對象和引用關系。
這個是Linux自帶的指令,檢視系統資源消耗情況,可以看看CPU、記憶體、SWAP、I/O的消耗情況,需要特别注意的有幾個值: ni,這個值如果特别高說明線程上下文切換開銷較大,看看是不是開了太多的線程導緻的 res,這個代表了程序實際占用的記憶體 swap,記憶體不足就會占用swap空間,這個時候一般應用的性能會急劇下降,需要特别關注
一個類似于BTrace的工具,用于對JVM運作時的狀态進行追蹤和診斷,作者是中間件團隊的聚石。 通常我們排查問題很多時候都在代碼中加個日志,看看方法的參數、傳回值是不是我們期望的,然後編譯打包部署重新開機應用,十幾分鐘就過去了。HouseMD可以直接讓你可以追蹤到方法的傳回值和參數,以及調用次數、調用平均rt、調用棧。甚至是類的成員變量的值、Class加載的路徑、對應的ClassLoader,都可以用一行指令給你展現出來,堪稱神器。 再偷偷告訴你,因為HouseMD是基于位元組碼分析來做的,是以理論上運作在JVM的語言都可以用它,包括Groovy,Clojure都可以。
通過jmap和MAT我們可以知道整個JVM堆的對象分布情況,但是有時候我們需要知道young/old/perm區分别有哪些對象的時候,就要用到TBJMap這個神器了。作者是中間件團隊的叔同。 他可以告訴你各個分代區各個Class的執行個體數、占用的空間,以及DirectMemory占用的空間等。
tsar是淘寶的采集工具,主要用來收集伺服器的系統資訊(如cpu,io,mem,tcp等)以及應用資料(如squid haproxy nginx等),tsar支援t實時檢視和曆史檢視,友善了解應用和伺服器的資訊。 Usage: tsar [options] Options: -check display last record for alert –check/-C display last record for alert.example:tsar –check / tsar –check –cpu –io –cron/-c run in cron mode, output data to file –interval/-i specify intervals numbers, in minutes if with –live, it is in seconds –list/-L list enabled modules –live/-l running print live mode, which module will print –file/-f specify a filepath as input –ndays/-n show the value for the past days (default: 1) –date/-d show the value for the specify day(n or YYYYMMDD) –merge/-m merge multiply item to one –detail/-D do not conver data to K/M/G –spec/-s show spec field data, tsar –cpu -s sys,util –help/-h help Modules Enabled: –cpu CPU share (user, system, interrupt, nice, & idle) –mem Physical memory share (active, inactive, cached, free, wired) –swap swap usage –tcp TCP traffic (v4) –udp UDP traffic (v4) –traffic Net traffic statistics –io Linux I/O performance –pcsw Process (task) creation and context switch –partition Disk and partition usage –tcpx TCP connection data –load System Run Queue and load average 用不同的參數可以看到曆史和實時資訊,CPU、Load、記憶體、網絡、QPS、rt等等你想要的監控資料幾乎都能看到。