前言
今天,遇到一个内存不足的问题而导致服务崩塌的情况,特此记录一下333!
错误警告: Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000efc80000, 75497472, 0) failed; error='Cannot allocate memory' (errno=12) # # There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation
很明显,错误提示已经很清楚的告诉你内存不足,无法分配内存到虚拟机,导致java进程无法继续。这也就是服务崩的主要原因。难怪上一次一直启动 tomcat 都不成功,🤣直接重启它又好了,就没有再继续追查。今天经过仔细的排查,终于找到问题所在。
原来在我上一次执行 shutdown.sh 的时候,实际没有退出,原因是有非守护进程没有退出,导致 jvm 没有退出,所以 tomcat 启动的进程并没有结束。当执行 ps -ef |grep tomcat 命令的时候还能看到它(不过是睡眠状态)但是还在占用着内存空间
解决办法一
第一种办法就是每当执行 shutdown.sh 的时候可以用 ps -ef |grep tomcat 查看它的进程,找到 PID 并手动将它 Kill 掉就可以了。但是此方法就是操作有点繁琐,那有没有其他办法呢?有!请看下一步
解决办法二
这一种办法呢就是修改 /bin 里头的 catalina.sh 文件和 shutdown.sh 文件,把 tomcat 的启动进程的 PID 保存下来,shutdown 的时候把这个 PID 强制关掉。
第一步
编辑 catalina.sh 文件,找到 PRGDIR=`dirname "$PRG"` 这一行,在其下面添加:
#判断 CATALINA_PID有没有配置,没有的话
#就使用当前目录(bin)的CATALINA_PID文件来记录tomcat的进程ID
if [ -z "$CATALINA_PID" ]; then
CATALINA_PID=$PRGDIR/CATALINA_PID
cat $CATALINA_PID
fi
如图所示:
然后保存即可
第二步
编辑 shutdown.sh 文件 修改最后一行,把原来的 exec "$PRGDIR"/"$EXECUTABLE" stop "$@" 改成 exec "$PRGDIR"/"$EXECUTABLE" stop -force "$@"
如图所示:
然后保存即可