Loading...

内存不足导致Tomcat崩溃问题排查与解决办法

前言

今天,遇到一个内存不足的问题而导致服务崩塌的情况,特此记录一下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

如图所示:

20230801231632224.webp

然后保存即可

第二步

编辑 shutdown.sh 文件 修改最后一行,把原来的 exec "$PRGDIR"/"$EXECUTABLE" stop "$@" 改成   exec "$PRGDIR"/"$EXECUTABLE" stop -force "$@"

如图所示:

202308012316446041.webp

然后保存即可

0

回到顶部