線上java服務(wù)不可用,一般分兩種情況:
java進(jìn)程掛掉
1. JVM異常退出
此類情況,會(huì)在java進(jìn)程的啟動(dòng)目錄下,發(fā)現(xiàn)hs_err_pid***.log文件,通過該日志文件能定位到j(luò)vm crash原因。該日志文件的解讀參見 jvm crash。一般在使用JNI時(shí),內(nèi)存分配容易引起crash。
2. 內(nèi)存溢出,進(jìn)程被OS殺掉
該類問題的表象是線上服務(wù)無端停掉,日志也看不出什么痕跡,此時(shí)在linux下可通過dmesg查看相關(guān)信息。一般是由于內(nèi)存不夠?qū)е碌摹?/p>
java進(jìn)程不可用
1. 線程死鎖
并發(fā)情況下,代碼問題引起線程死鎖,當(dāng)請(qǐng)求不斷過來,引起線程堆積無法正常結(jié)束。一旦線程達(dá)到中間件的上限時(shí),中間件將無法響應(yīng)外部請(qǐng)求,線上表現(xiàn)為進(jìn)程存在,但服務(wù)不能響應(yīng)。此時(shí)通過
jstack pid
能看到線程堆棧信息,通過查找BOLOCKED鎖定的資源,定位到死鎖位置
2. 線程阻塞
該情況與線程死鎖類似,但通過查看堆棧信息,往往找不到哪個(gè)資源被鎖,如下的jstack報(bào)告
"ajp-nio-8009-exec-470" daemon prio=10 tid=0x00007f559c016800 nid=0x4d55 waiting for monitor entry [0x00007f5590e6a000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.util.LinkedHashMap.createEntry(LinkedHashMap.java:442)
at java.util.HashMap.addEntry(HashMap.java:884)
......
"ajp-nio-8009-exec-470" daemon prio=10 tid=0x00007f559c016800 nid=0x4d55 waiting for monitor entry [0x00007f5590e6a000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.util.LinkedHashMap.createEntry(LinkedHashMap.java:442)
at java.util.HashMap.addEntry(HashMap.java:884)
......
日志中有大量的此類線程,也無法看到查到類似
-locked <0x00000000c6eb8560>之類的日志 。
此時(shí)應(yīng)當(dāng)通過jstat查找gc的相關(guān)日志。
原因參見 gc block thread
3.數(shù)據(jù)庫(kù)問題
此類問題比較常見,由于db操作不當(dāng),引起數(shù)據(jù)庫(kù)死鎖或等待。死鎖通過db console能方便定位,但uncommit引起的鎖定位起來就比較費(fèi)勁。具體來說,應(yīng)用通過jdbc連接db,在使用事務(wù)時(shí),多個(gè)操作會(huì)共用一個(gè)db session,并且此時(shí)db session的auto commit是關(guān)閉的。若連接未顯示commit,且操作后連接也未關(guān)閉,此時(shí)將會(huì)導(dǎo)致該連接的寫操作占用的資源一直不釋放,若其他請(qǐng)求需要操作同樣的數(shù)據(jù)(寫操作),此時(shí)會(huì)引發(fā)鎖等待。