【JVM】内存和SWAP问题

一、现象

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、物理内存不够用

  • 增大物理内存。
  • 分析导致占用内存过大的原因,进行程序优化。或进行服务的拆分

四、具体案例

记录一次线上SWAP偏高告警的故障分析过程 

【JVM】jdk1.8-jetty-swap被占满问题排查 

posted @ 2019-05-15 11:50  leon66666  阅读(1807)  评论(0编辑  收藏