一、问题背景
该问题出现在我们测试环境。测试环境部署了很多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