一、現象
1、系統穩定運行,偶爾發生響應超時的情況。查看下游依賴服務和數據庫狀態都良好。超時完全是由於服務本身問題造成的。重啟不能解決問題,一直會間隔性的發生超時
二、原因分析
第一種情況,系統內存夠用(JVM內存未使用到SWAP內存),但JVM內存不夠,最終導致JVM的頻繁垃圾回收(FGC),嚴重影響性能 (stop the word)
第二種情況,系統內存不夠,把JVM堆部分用到了SWAP,那么此時的垃圾回收需要把SWAP的內存換回到系統物理內存再進行JVM的垃圾回收。最大影響,導致每次GC的時間變得很久
第三種情況, 物理內存不夠用, 大量JVM的堆內存被交換到SWAP后,垃圾回收時,把SWAP內存換回物理內存,但SWAP的內存又不會立即回, 此時可以觀察到垃圾回收同時swap使用的內存會變大(其它部分內存要交換到SWAP里)
第四種情況,進程因為內存問題而被系統殺掉。開啟SWAP分區,可以有效防止進程因為內存問題而被系統殺掉
三、解決方案
1、系統內存夠用(JVM內存未使用到SWAP內存),但JVM內存不夠,導致JVM的頻繁GC
- 增大JVM內存,但有可能導致第二種情況的問題出現
- 如果機器資源充足,建議把影響的業務獨立拆分,分開部署
- 如果機器資源不是很充足,只能進行代碼的優化了
2、系統內存不夠,把JVM堆部分用到了SWAP,導致每次GC的時間變得很久
- 增大系統內存,但是有最大物理內存的限制。一般每個虛擬機的系統內存是固定分配的
- 分析導致占用內存過大的原因,進行程序優化
3、物理內存不夠用
- 增大物理內存。
- 分析導致占用內存過大的原因,進行程序優化。或進行服務的拆分