jar包運行一段時間后莫名其妙掛掉線上問題及處理方案
1、問題描述
springboot搭建的項目打包成jar包部署到Linux操作系統(tǒng)中,采用nohup java -jar 部署 jar 包后過一段時間(兩三天)后莫名其妙掛掉(進程號PID被殺)。
2、問題定位
2.1 度娘一下
遇到這種問題,首先當然是去度娘找找看看有沒有相似的人有這樣的bug,看看別人的處理方法解決,結(jié)果當然是沒找到合適的博客,所以就只能自己摸索摸索解決之道了。
2.2 基本操作
既然沒有找到想要的,這種情況百分之九十九點九九九......的概率是內(nèi)存泄露導致的。
那基本操作來一下
2.2.1 top、free -m 指令
先用top指令看下Linux系統(tǒng)中的進程號使用情況

從上圖可看到,cpu的占用竟然干到了 100.3%以上,這么耗費cup資源,肯定就是程序有問題了。
接著用 free -m查看下內(nèi)存使用情況

結(jié)果發(fā)現(xiàn)這個空閑內(nèi)存越來越少了,還真的是內(nèi)存有問題。
3、問題深入定位
上面只是初步知道程序有問題,但是還是不知道具體的問題再哪里?
就是這個問題在代碼中哪里造成的還是不清楚
3.1 top -Hp PID 指令
輸入PID指令將程序進程號的子線程使用系統(tǒng)資源的線程列舉出來

從上圖中可以看到733這個子線程占用了99.9%的cup使用率,這個線程肯定是有問題的,這個就要進入到JVM的棧中分析問題了,這里需要使用jstack工具進行分析問題。
3.2 jstack -l PID |grep -A 10 NID
因為在棧中的線程號是以16進制進行的,所以需要將上面733這個線程號轉(zhuǎn)成16進制的數(shù)據(jù),直接在Linux中轉(zhuǎn)換: printf "%x\n" 733

然后采用jstack棧分析工具進行問題分析
jstack -l 655 |grep -A 10 0x2dd
這里的10是指打印10行的日志

找到這個子線程號,并且看到自己的報名和類,這個線程占用cpu 99.9%以上的資源就在類
ServerHandler的129行,趕緊去看看自己這個類的第129行到底寫了什么東西。

這段代碼直接導致了死循環(huán),該段代碼是希望讀到輸入流里面總的字節(jié)大小,但有時候因為網(wǎng)絡原因無法一次讀到結(jié)果,再加上while死循環(huán),如果一直讀不到,死循環(huán)就一直執(zhí)行下去,故造成了死循環(huán)
4、解決

將上面導致死循環(huán)的代碼注釋掉改為緩存處理
5、后續(xù)
以上是一次線程問題的解決,其實一次線上問題解決沒有那么快就排查出來的,如果涉及到堆問題,需要將堆問題、棧日志打印保存下來分析
堆文件生成:
jmap -dump:format=b,file=heap.hprof pid //保存了堆現(xiàn)場,b這里是字節(jié)的意思
(生成的堆文件采用mat分析軟件定位問題)
- 棧日志生成:jstack pid > jstack.log //線程棧的現(xiàn)場
- gc執(zhí)行情況:jstat -gcutil 6343 5000 //每隔5秒檢查gc使用情況
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
詳解Spring Boot中使用AOP統(tǒng)一處理Web請求日志
本篇文章主要介紹了詳解Spring Boot中使用AOP統(tǒng)一處理Web請求日志,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05
springboot 使用yml配置文件給靜態(tài)變量賦值教程
這篇文章主要介紹了springboot 使用yml配置文件給靜態(tài)變量賦值教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
Java并發(fā)編程中的生產(chǎn)者與消費者模型簡述
這篇文章主要介紹了Java并發(fā)編程中的生產(chǎn)者與消費者模型簡述,多線程并發(fā)是Java編程中最終要的部分之一,需要的朋友可以參考下2015-07-07
SpringBoot結(jié)合dev-tool實現(xiàn)IDEA項目熱部署的流程步驟
這篇文章主要給大家介紹了SpringBoot結(jié)合dev-tool實現(xiàn)IDEA項目熱部署的流程步驟,文章通過圖文介紹的非常詳細,對大家的學習有一定的幫助,需要的朋友可以參考下2023-10-10
IDEA 2020.1 搜索不到Chinese (Simplified) Language
小編在安裝中文插件時遇到IDEA 2020.1 搜索不到Chinese ​(Simplified)​ Language Pack EAP,無法安裝的問題,本文給大家分享我的解決方法,感興趣的朋友一起看看吧2020-04-04
SpringBoot使用Caffeine實現(xiàn)緩存的示例代碼
本文主要介紹了SpringBoot使用Caffeine實現(xiàn)緩存的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07
windows環(huán)境下java開發(fā)工具maven的安裝教程圖解
Maven是一個項目管理和綜合工具。Maven提供了開發(fā)人員構(gòu)建一個完整的生命周期框架。這篇文章主要介紹了windows環(huán)境下java開發(fā)工具maven的安裝,非常不錯對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07

