Java應用線上問題排查工具

應用上線之后總會出現(xiàn)各種各樣的問題,這些問題包括但不限于一下幾類問題:

  1. 線程問題
  2. cpu消耗較多
  3. 內(nèi)存問題
  4. 進程莫名crash或者被系統(tǒng)kill
  5. gc時間過長
    在排查這類問題時,jdk提供了一系列工具幫助開發(fā)人員更好地定位問題。

jstack

jstack主要用來排查線程相關(guān)的問題,比如應用內(nèi)線程數(shù)飚高,線程死鎖,以及應用cpu過高,在遇到此類問題時可以通過jstack打印出線程棧信息。首先通過ps命令或者jps找出應用的進程id,然后通過jstack將棧信息打印到文件中;
jstack的用法如下:


jstack usage

通過jstack可以知道應用內(nèi)的線程數(shù)正在做什么,常用的用法是通過jstack -l <pid> > stack_<pid>.log,將線程棧信息打印到文件中,查看線程的執(zhí)行情況,若遇到應用進程占用cpu較多,可以通過top -p pid-H獲取到是哪個線程消耗cpu較多,然后將線程id轉(zhuǎn)換成十六進制,從線程棧文件找出對應的線程正在做什么,排查死鎖問題,則直接查找線程棧文件,基本可以找出來大部分的死鎖的問題。

jmap

排查內(nèi)存溢出非常好用的工具,通過jmap可以打印出jvm堆中對象的數(shù)量及引用關(guān)系,在dump堆之后可以通過MAT或者HA分析出哪個對象實例占用較多,是否有內(nèi)存泄露的情況。
jmap的用法如下:


jmap usage

常用的用法有:
jmap -histo:live <pid>,這種用法會強制執(zhí)行一次fgc;
jmap -heap <pid>,直接打印出各對象實例的分布情況;
jmap -dump:[live],format=b,file=dump.bin <pid>,將heap dump到指定文件中

jstat

jstat在排查gc問題時真的很好用,它能夠提供一些統(tǒng)計信息,包括gc次數(shù),gc原因,內(nèi)存占用等。還是先來看一下jstat的用法吧:


jstat usage

比較常用的用法有:
jstat -gcutil <pid> [interval],每隔interval(ms)打印出進程pid的gc情況;
jstat -gccause <pid> [interval],對于gcutil選項,該選項會將gc的原因列出來;

jinfo

jinfo主要用來查詢jvm進程的運行時的jvm參數(shù),以及修改jvm運行時的參數(shù),主要用法如下:
jinfo -flag <name> <pid>,查詢進程pid name的參數(shù)值;
jinfo -flag <name>=<value> <pid>,設置jvm參數(shù)name的值為value;
jinfo -flag [+|-]<name>,啟用某個參數(shù)或禁用某個參數(shù)。
另外通過btrace、HSDB這些工具可以查看到應用中更為細節(jié)的東西,在排查問題的時候真的好用,誰用誰知道。
工具雖然好用,但是也只能事后幫助我們排查具體問題,在平時的編碼過程過還是需要我們養(yǎng)成良好的編碼習慣,遵循最佳實踐,合理配置jvm參數(shù),才能減少此類問題的發(fā)生。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容