问题描述
- Linux环境下部署两个spring boot应用,部署—>测试—>重新部署这样的过程重复N次。最后完成时发现8G内存被占用97%,一定出问题。
问题排查
- spring boot 既然是Java应用,那就查看有关Java进程都占用了多少多少内存。命令: ps -aux | grep java。结果如下图:
- 看到结果已经大概猜出导致内存被占满的原因。只部署了两个应用,应该是开启两个进程,而上图有六个进程。
解决问题
- 为保证如上的进程都是来自同一应用(把服务器的其他应用进程kill掉就大事不好了),使用命令:
cd /proc/33061 # 数字为pid
ll # 打完上一行命令再打这个
- 解释上面的命令:由于linux在启动一个进程时,会在/proc下创建一个以PID命名的文件夹,该进程的信息存在该文件夹下。在该文件夹下有一个名为exe的文件,该文件指向了具体的命令文件,所以可以通过ls -l或者ll命令根据ps或top查到的PID查找命令的绝对路径。结果如下:
- 通过如上方式排查,可以确定这六个进程都是出自我要部署的两个应用。那么进行进一步筛选,筛选出哪些进程是无效进程。命令:
netstat -lanp | grep java
结果:
- 如上图所示,没有端口的进程则是无效的,得出筛选结果。然后把本次筛选结果与第一次筛选结果取交集可得出有哪些进程是我们需要kill的。到此,问题解决。
问题发生原因
- 问题解决后,细细回想部署中的一些操作。总结原因如下:
- spring boot 启动的过程中遇到某些问题没有成功启动,但是进程没有因此挂掉,反而继续存活,此时又不会占用任何端口。
以上就是问题发生的原因和解决过程,万万不可粗心。