線上tomcat或後臺task java進程偶發性出現假死,徹底沒有規律java
java -version
// 查看操做系統版本信息 cat /proc/version
// 查看操做系統內核信息 uname -a
// 查看系統版本信息的命令 lsb_release -a
ps -ef | grep java
查詢到該進程的ID是12635,監聽的端口是10061,後面會用到linux
// 查看該tomcat服務監聽的端口,並將結果輸出至日誌文件 netstat -an | grep 10061 >> netstat-sku.log // 查看前200行內容 head -n 200 netstat-sku.log
發現大量close wait,初步能夠判斷是close wait致使的假死 git
// 查看內存使用狀況 jmap -heap 12635
Eden Space 內存基本耗費完,但沒有觸發GCgithub
-F to force a thread dump. Use when jstack <pid> does not respond (process is hung) 強制線程轉儲。當jstack <pid>沒有響應時使用(進程掛起)tomcat
// 將該進程的全部線程信息打印輸出至指定文件 jstack -F 12635 >> jstack-12635.log
發現全部的線程處於BLOCKED狀態 jvm
極其像Linux內核的一個bug, 某個switch分支缺乏memory barrier的正確處理,致使外部應用如JVM的lock被錯誤鎖住;通常jstack連後就恢復 連接地址操作系統
參考資料線程
掃描二維碼關注「熊英的小屋」,這裏永遠有一個位置爲你開放 3d