问题描述:
在centos7上部署多个springcloud项目。出现了服务莫名其妙会挂掉一两个的问题,重新启动挂掉的服务之后又会出现其他服务挂掉的情况,查看启动日志也并没有发现有异常抛出。令人费解的是所有的服务都是通过nohup java -jar xxx.jar &启动的,理论上不会随随便便挂掉。
产生原因:
一开始我猜测,是GC回收,导致服务挂掉。但并不是这么回事,GC虽然有STW现象,但是一般不会结束总进程。后面折腾了好几天,才发现,因为启动的jar包项目过多,服务器运行内存不足,linux系统kill掉了某些jar进程。
因此,总结来说,多个springboot项目部署在同一台服务器上,都有可能出现nohup java -jar启动的进程仍莫名其妙挂掉的问题,如果是企业,应该换用更好的服务器配置,但是我们没有那么多资金购买服务器怎么办?其实有两种解决方法:
解决方法:
第一种方法:进行JVM调优可以改善这种情况,但是项目太多,我们的服务器配置实在太低,仍然无法解决此问题,这里不做讨论了。
第二种方法:我们可以通过分配虚拟内存的方式解决
步骤一、查看当前的内存使用情况
free -m
步骤二、划分虚拟内存分区(大小为2G),执行命令大约15-20秒无响应
dd if=/dev/zero of=/var/swap bs=1024 count=2048000
步骤三、执行下面两条命令: 将分区设置为SWAP分区,并将其设置为有效状态
mkswap /var/swap
swapon /var/swap
步骤四、查看现在的内存使用情况
free -m
我们发现,Swap虚拟内存中已经由0变成了1999,说明我们已经成功分配了大约2G的虚拟内存。接下来让我们启动多个项目看一下能不能正常使用Swap的虚拟内存
大家可以看到,我已经启动了六个jar包项目,在Swap中,已经有内存被使用了,而且项目都在正常运行。问题得到解决!
步骤五、设置开机自动挂载虚拟内存
如果你不想每次重启服务器都重新设置一遍,那么你可以设置开机自动挂载Swap分区,编辑文件/etc/fstab
vim /etc/fstab
在文件最后追加内容:
/var/swap swap swap default 0 0
其中/var/swap就是我们刚刚分配的swap交换空间的位置,如果你不是在硬盘的这个位置划分的虚拟内存,只需把追加内容中的/var/swap换成你的虚拟内存的路径就可以了,剩下的追加内容不变。