问题描述:
暑假期间在个人服务器上部署springcloud项目。出现了服务莫名其妙会挂掉一两个的问题,重新启动挂掉的服务之后又会出现其他服务挂掉的情况,查看启动日志也并没有发现有异常抛出。令人费解的是所有的服务都是通过nohup java -jar xxx.jar &启动的,理论上不会随随便便挂掉。
一开始我猜测,是GC回收,导致服务挂掉。但并不是这么回事,GC虽然有STW现象,但是一般不会结束总进程。后面折腾了好几天,才发现,因内存不足,linux系统kill掉了jar进程。
因此,要是springboot多个项目部署在同一台服务器上,都有可能出现nohup java -jar启动的进程仍莫名其妙挂掉的问题,如果是企业,应该换用更好的服务器配置,但是我们个人没有那么多资金购买服务器怎么办?
解决方法:
通过分配虚拟内存解决内存不足的问题,这是最简单有效的方法(其实你也可以通过设置jar包运行时分配的空间进行调优,但是项目比较多的话不推荐,仍然不能解决内存不足的问题)
这是我在参考了CSDN一位博主的博客之后,找到的解决方法
原文地址:https://blog.csdn.net/qq_39751120/article/details/94356085
通过给服务器虚拟出一个磁盘分区,当内存不足的时候,新的服务会挂载到虚拟分区上。这样保证系统不会kill掉先前运行的服务。
可以通过上述博主链接去参考分配空间的命令行,或者按照我下面的步骤来敲命令行
步骤①:查看你服务器内存: free -m
控制台输出:
[root@VM_0_9_centos ~]# free -m
total used free shared buff/cache available
Mem: 1838 1632 72 0 133 59
Swap: 0 0 0
步骤②:建立虚拟分区:dd if=/dev/zero of=/opt/swap bs=1024 count=2048000
命令表示在opt分区建立名为swap,大小为2G的虚拟内存文件。敲击回车之后大约有10-20秒的无反应状态,等一会。
控制台输出:
[root@VM_0_9_centos ~]# dd if=/dev/zero of=/opt/swap bs=1024 count=2048000
2048000+0 records in
2048000+0 records out
2048000000 bytes (2.0 GB) copied, 13.16245 s ,155 MB/s
步骤③:将swap文件设置为swap分区文件:
chmod 600 /opt/swap
mkswap /opt/swap
步骤④:激活swap,启用分区交换文件
swapon /opt/swap
步骤⑤:查看分区结果
free -m
[root@VM_0_9_centos ~]# free -m
total used free shared buff/cache available
Mem: 1838 1632 72 0 133 59
Swap: 1999 0 1999
Swap.total大小就是你分配的虚拟内存大小,Swap.used是当前已使用的虚拟内存大小,Swap.free是空闲虚拟内存大小
到这里,分配完成,当内存不足时,linux也不会kill掉你的进程了。
当我启动多个服务之后:
[root@VM_0_9_centos ~]# free -m
total used free shared buff/cache available
Mem: 1838 1632 72 0 133 59
Swap: 1999 228 1771
发现已经在Swap空间有内存被使用了。而且服务都正常运行