Java問題排查整理

Java問題排查工具箱

  • 問題排查

    • 解決思路,邏輯推導(dǎo)
    • 工具
  • 日志相關(guān)工具

    • 日志的標準化
      • to be continued...
    • tail
      • tail -f app-server.log
      • tail -n 300 app-server.log
    • find
    • fgrep
    • awk
    • grep -C/A/B 30 'aaa' app-server.log
  • CPU相關(guān)工具

    • top (real-time 觀察系統(tǒng)的情況)

      • top
      • top -Hp <pid>
      • top (press 1 show multi-cores, press 1 again to close, press q exit)
    • sar

      • 查看歷史指標數(shù)據(jù),除了CPU外静陈,其他內(nèi)存呼寸,磁盤殿如,網(wǎng)絡(luò)等等各種指標都可以查看
    • jstack

      • 通常對于應(yīng)用沒反應(yīng)祖驱,非常慢等等場景
      • jstack默認只能看到Java棧茶没,而jstack -m則可以看到線程的Java棧和native棧秒咨,但如果Java方法被編譯過稚瘾,則看不到(然而大部分經(jīng)常訪問的Java方法其實都被編譯過)
      • -F 走JDK SA
        • /proc/<pid>/mappings
        • ptrace(PTRACE_ATTACH, PTRACE_PEEKDATA)
      • 默認或-l走JDK Attach mechanism
      • -m or -F走JDK SA mechanism
      • java的tda工具就是專門分析thread dump的
      • 在線分析工具
      • kill -3 $PID / kill -QUIT $PID tomcat會把thread dump的內(nèi)容輸出到控制臺
      • We can use kill -3 PID command to generate the thread dump. This is slightly different from other ways to generate thread dump. When kill command is issued, thread dump is generated to the System out of the program. So if it’s a java program with console as system out, the thread dump will get printed on the console. If the java program is a Tomcat server with system out as catalina.out, then thread dump will be generated in the file.
        死鎖,Deadlock(重點關(guān)注)
        執(zhí)行中周霉,Runnable
        等待資源掂器,Waiting on condition(重點關(guān)注)
        等待獲取監(jiān)視器,Waiting on monitor entry(重點關(guān)注)
        暫停俱箱,Suspended
        對象等待中国瓮,Object.wait() 或 TIMED_WAITING
        阻塞,Blocked(重點關(guān)注)
        停止,Parked
    • jcmd

      • Java 8 has introduced jcmd utility. You should use this instead of jstack if you are on Java 8 or higher. Command to generate thread dump using jcmd is jcmd PID Thread.print.
    • pstack

      • pstack可以用來看Java進程的native棧
    • perf

      • 一些簡單的CPU消耗的問題靠著top -H + jstack通常能解決乃摹,復(fù)雜的話就需要借助perf這種超級利器了
    • cat /proc/interrupts

      • 之所以提這個是因為對于分布式應(yīng)用而言禁漓,頻繁的網(wǎng)絡(luò)訪問造成的網(wǎng)絡(luò)中斷處理消耗也是一個關(guān)鍵,而這個時候網(wǎng)卡的多隊列以及均衡就非常重要了孵睬,所以如果觀察到cpu的si指標不低播歼,那么看看interrupts就有必要了
  • 內(nèi)存相關(guān)工具

    • jstat
      • jstat -gcutil或-gc等等有助于實時看gc的狀況,不過我還是比較習(xí)慣看gc log
      • *.gc日志查看 or http://gceasy.io這個網(wǎng)站支持gc日志分析, *.gz or *.zip
    • jmap
      • memory dump分析內(nèi)存泄漏
      • 在需要dump內(nèi)存看看內(nèi)存里都是什么的時候肪康,jmap -dump可以幫助你荚恶;在需要強制執(zhí)行fgc的時候(在CMS GC這種一定會產(chǎn)生碎片化的GC中,總是會找到這樣的理由的)磷支,jmap -histo:live可以幫助你(顯然,不要隨便執(zhí)行)食寡。
    • gcore
      • 相比jmap -dump雾狈,其實我更喜歡gcore,因為感覺就是更快抵皱,不過由于某些jdk版本貌似和gcore配合的不是那么好善榛,所以那種時候還是要用jmap -dump的
    • eclipse mat
      • 有了內(nèi)存dump后,沒有分析工具的話然并卵呻畸,mat是個非常贊的工具移盆,好用的沒什么可說的?
      • 我傾向于用IBM Memory Analyzer
    • btrace
      • 少數(shù)的問題可以mat后直接看出,而多數(shù)會需要再用btrace去動態(tài)跟蹤伤为,btrace絕對是Java中的超級神器咒循,舉個簡單例子,如果要你去查下一個運行的Java應(yīng)用绞愚,哪里在創(chuàng)建一個數(shù)組大小>1000的ArrayList叙甸,你要怎么辦呢,在有btrace的情況下位衩,那就是秒秒鐘搞定的事
    • gperf
      • Java堆內(nèi)的內(nèi)存消耗用上面的一些工具基本能搞定裆蒸,但堆外就悲催了,目前看起來還是只有g(shù)perf還算是比較好用的一個糖驴,或者從經(jīng)驗上來說Direct ByteBuffer僚祷、Deflater/Inflater這些是常見問題
  • 除了上面的工具外,同樣內(nèi)存信息的記錄也非常重要贮缕,就如日志一樣辙谜,所以像GC日志是一定要打開的,確保在出問題后可以翻查GC日志來對照是否GC有問題跷睦,所以像-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc: 這樣的參數(shù)必須是啟動參數(shù)的標配

  • ClassLoader相關(guān)工具

    • 作為Java程序員筷弦,不碰到ClassLoader問題那基本是不可能的,在排查此類問題時,最好辦的還是-XX:+TraceClassLoading烂琴,或者如果知道是什么類的話爹殊,我的建議就是把所有會裝載的lib目錄里的jar用jar -tvf *.jar這樣的方式來直接查看沖突的class,再不行的話就要呼喚btrace神器去跟蹤Classloader.defineClass之類的了
  • 其他工具

    • jinfo
      • Java有N多的啟動參數(shù)奸绷,N多的默認值梗夸,而任何文檔都不一定準確,只有用jinfo -flags看到的才靠譜号醉,甚至你還可以看看jinfo -flag反症,你會發(fā)現(xiàn)更好玩的
    • dmesg
      • 你的java進程突然不見了? 也許可以試試dmesg先看看
    • systemtap
      • 有些問題排查到j(luò)ava層面是不夠的畔派,當需要trace更底層的os層面的函數(shù)調(diào)用的時候铅碍,systemtap神器就可以派上用場了
    • gdb
      • 更高級的玩家們,拿著core dump可以用gdb來排查更詭異的一些問題
  • 暫時就寫這些线椰,盡管工具的使用多數(shù)都可以臨時學(xué)胞谈,但首先知道有哪些工具是最重要的,然后呢還是建議大家可以玩一玩這些工具憨愉,這樣以后真的要用的時候也不至于一點印象都沒有

  • References

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末烦绳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子配紫,更是在濱河造成了極大的恐慌径密,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躺孝,死亡現(xiàn)場離奇詭異享扔,居然都是意外死亡,警方通過查閱死者的電腦和手機括细,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門伪很,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奋单,你說我怎么就攤上這事锉试。” “怎么了览濒?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵呆盖,是天一觀的道長。 經(jīng)常有香客問我贷笛,道長应又,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任乏苦,我火速辦了婚禮株扛,結(jié)果婚禮上尤筐,老公的妹妹穿的比我還像新娘。我一直安慰自己洞就,他們只是感情好盆繁,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著旬蟋,像睡著了一般油昂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上倾贰,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天冕碟,我揣著相機與錄音,去河邊找鬼匆浙。 笑死安寺,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的吞彤。 我是一名探鬼主播我衬,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼饰恕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起井仰,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤埋嵌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后俱恶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雹嗦,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年合是,在試婚紗的時候發(fā)現(xiàn)自己被綠了了罪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡聪全,死狀恐怖泊藕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情难礼,我是刑警寧澤娃圆,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站蛾茉,受9級特大地震影響讼呢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谦炬,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一悦屏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦础爬、人聲如沸甫贯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽获搏。三九已至,卻和暖如春失乾,著一層夾襖步出監(jiān)牢的瞬間常熙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工碱茁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留裸卫,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓纽竣,卻偏偏與公主長得像墓贿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蜓氨,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容