一、問題背景
該問題出現在我們測試環境。測試環境部署了很多java應用。
其中一個數據服務(主要提供訂單交易數據聚合查詢),用着用着就服務掛掉了也就是進程沒有了。
二、分析過程
1.了解服務器配置 =====》 4核8G內存
2.通過 ps -ef|grep java 查看被關掉的應用 當前進程id及PID 和分配的內存大小 =====》 1G =>4G (下圖是我處理完后截取的圖片所以最大值只是2G)
3.通過top -p PID 命令實時查看該PID內存使用情況
4.根據現象發現問題
發現該java應用的使用內存,只增不減。也就是java垃圾收集器並沒有觸發。
原來JAVA虛擬機會一直增加內存占用,一直到你設置的最大內存4096M附近,才會觸發垃圾回收機制,內存回收。但是由於服務器部署了很多其他java應用占用了4G左右,無法分配給該應用4G內存。當快達到4G時,導致服務器內存告警而將該進程kill掉
三、解決方案
將java虛擬機內存最大值調低到不大於服務器剩余的內存。
我將服務器內存從4G調到2G就可以了,該應用內存使用一直維持在2G內(快到2G時會觸發垃圾回收的),從而不會導致總內存不足導致服務器kill掉進程。
-Xms1024m -Xmx2048m