在長期排查線上問題的過程當中,總結了一些工具的用法和排查問題的思路,這裏跟你們分享一下,在遇到相似的問題時,但願能給予一些幫助。linux
首先講講工具, jvm 自帶的一些工具是必須熟練掌握的,例如jstack, jmap, jstat等,它們能夠幫咱們去深刻了解JVM正在作的事情,主要的適用領域有這些:nginx
jstack能夠告訴你當前全部JVM線程正在作什麼,包括用戶線程和虛擬機線程,你能夠用它來查看線程棧,而且結合Lock信息來檢測是否發生了死鎖和死鎖的線程。git
沒事兒jstack一下,知道你的小夥伴正在作什麼。github
另外在用top -H看到佔用CPU很是高的pid時,能夠轉換成16進制後在jstack dump出來的文件中搜索,看看究竟是什麼線程佔用了CPU。服務器
stat,顧名思義就是提供一些統計信息,它能夠告訴你當前的GC狀況,包括GC次數、時間,具體的GC還能夠結合gc.log文件去分析。網絡
通常來講,咱們用jstat去查看GC狀況,判斷是否存在YGC或FGC頻繁的狀況,再去看gc.log和jamp dump內存,MAT分析來定位問題(後面會有一個case針對這種場景)。eclipse
經常使用的用法是jstat -gcutil pid time_intervaljvm
排查GC問題必然會用到的工具,jmap能夠告訴你當前JVM內存堆中的對象分佈及其關係,當你dump堆以後能夠用MAT分析,看看有哪些大對象,或者哪些類的實例特別多。tcp
經常使用用法:工具
強制FGC:-histo:live
dump堆:-dump:[live],format=b,file=dump.bin
查看各代內存佔用狀況:-heap
而後咱們來介紹一些開源的工具,來加強JVM工具自己的做用。
GC分析必備,用於分析jmap或OOM時dump出來的內存快照,能夠看到對象和引用關係。
官方地址: http://www.eclipse.org/mat/
這個是 linux 自帶的命令,查看系統資源消耗狀況,能夠看看CPU、內存、SWAP、I/O的消耗狀況,須要特別注意的有幾個值:
ni,這個值若是特別高說明線程上下文切換開銷較大,看看是否是開了太多的線程致使的
res,這個表明了進程實際佔用的內存
swap,內存不足就會佔用swap空間,這個時候通常應用的性能會急劇降低,須要特別關注
一個相似於BTrace的工具,用於對JVM運行時的狀態進行追蹤和診斷,做者是中間件團隊的聚石。
一般咱們排查問題不少時候都在代碼中加個日誌,看看方法的參數、返回值是否是咱們指望的,而後編譯打包部署重啓應用,十幾分鍾就過去了。HouseMD能夠直接讓你能夠追蹤到方法的返回值和參數,以及調用次數、調用平均rt、調用棧。甚至是類的成員變量的值、Class加載的路徑、對應的ClassLoader,均可以用一行命令給你展示出來,堪稱神器。
更多的用法能夠參考詳細的WiKi: https://github.com/CSUG/HouseMD
再偷偷告訴你,由於HouseMD是基於字節碼分析來作的,因此理論上運行在JVM的語言均可以用它,包括Groovy,Clojure均可以。
經過jmap和MAT咱們能夠知道整個JVM堆的對象分佈狀況,可是有時候咱們須要知道young/old/perm區分別有哪些對象的時候,就要用到TBJMap這個神器了。做者是中間件團隊的叔同。
他能夠告訴你各個分代區各個Class的實例數、佔用的空間,以及DirectMemory佔用的空間等。
用法很簡單,一行命令便可。WiKi: https://github.com/alibaba/TBJMap
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等等你想要的監控數據幾乎都能看到。
目前tsar已經開源: http://tsar.taobao.org/