現(xiàn)象:前段時間發(fā)現(xiàn)某臺開發(fā)機上各個微服務(wù)進程占用內(nèi)存很高硕旗,經(jīng)常出現(xiàn)某個服務(wù)掛掉的現(xiàn)象,這里記錄下解決思路方案,僅供參考。
查看發(fā)現(xiàn)服務(wù)器剩余內(nèi)存很小
free -m
這是臺測試服務(wù)器紊遵,內(nèi)存本來就小,但是運行的服務(wù)挺多塑猖,包括一個微服務(wù)和springboot項目积仗,本身微服務(wù)就很占內(nèi)存品姓,幾個微服務(wù)項目的服務(wù)直接就把服務(wù)器內(nèi)存占光了,所有新增了springboot項目后經(jīng)常出現(xiàn)某個服務(wù)掛掉的現(xiàn)象箫措。
所以想著看看能不能較少某個服務(wù)的分配內(nèi)存來增加項目存活的可能性腹备。
解決問題之前,先復(fù)習(xí)下幾個基礎(chǔ)知識斤蔓。
1植酥、什么是RES?top命令經(jīng)诚夷担看到的
RES:resident memory usage 常駐內(nèi)存
(1)進程當(dāng)前使用的內(nèi)存大小友驮,但不包括swap out
(2)包含其他進程的共享
(3)如果申請100m的內(nèi)存,實際使用10m驾锰,它只增長10m卸留,與VIRT相反
(4)關(guān)于庫占用內(nèi)存的情況,它只統(tǒng)計加載的庫文件所占內(nèi)存大小
RES = CODE + DATA
2椭豫、JVM內(nèi)存模型
非heap(非heap=元空間+棧內(nèi)存+…)+heap+JVM進程運行所需內(nèi)存+其他數(shù)據(jù)
因為測試環(huán)境耻瑟,使用的人員比較少,并且出現(xiàn)問題是在新增了其他的項目都出現(xiàn)的赏酥,所有排除了代碼的問題喳整。(也有可能是jvm內(nèi)存泄漏引起的,大家有這個問題的話可以去用Jmap命令將整個heap dump下來裸扶,然后用jvisualvm分析)
這里用到的命令:
jmap -heap [pid]
//關(guān)于內(nèi)存占用比例的一個命令
ps aux | sort -k4nr | head -n 10
- 注意:如果服務(wù)器中有多個jdk框都,請到具體的jdk/bin下執(zhí)行jmap命令,
/usr/local/jdk1.8.0_74/bin/jmap -heap 28177
圖1中jvm占用內(nèi)存計算:
元空間(5MB)+ eden(118MB)+年老代(187MB)+線程棧(49*1024KB)+JVM進程本身運行內(nèi)存+ NIO的DirectBuffer +JIT+JNI+…≈top(Res) 470MB
當(dāng)前jvm線程數(shù)統(tǒng)計:jstack 7311 |grep ‘tid’|wc –l
(linux 64位系統(tǒng)中jvm線程默認棧大小為1MB)
所以去修改啟動腳本姓言,修改項目服務(wù)的JVM大兴蚕睢;部署系統(tǒng)的啟動腳本何荚,正確的Java命令:
java [ options ] class [ arguments ]
java [ options ] -jar file.jar [ arguments ]
- 注意:linux執(zhí)行命令的時候要注意空格的使用囱淋,千萬不能多打