惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
量子位
博客园 - 司徒正美
IT之家
IT之家
V
Visual Studio Blog
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
Google DeepMind News
Google DeepMind News
Last Week in AI
Last Week in AI
Microsoft Security Blog
Microsoft Security Blog
T
Tailwind CSS Blog
aimingoo的专栏
aimingoo的专栏
GbyAI
GbyAI
Vercel News
Vercel News
B
Blog
大猫的无限游戏
大猫的无限游戏
D
DataBreaches.Net
小众软件
小众软件
罗磊的独立博客
博客园 - 叶小钗
雷峰网
雷峰网
Martin Fowler
Martin Fowler
Hugging Face - Blog
Hugging Face - Blog
WordPress大学
WordPress大学

牛牛技术客栈

设计模式-备忘录模式 - OXOXTECH 牛牛技术客栈 设计模式-中介者模式 - OXOXTECH 牛牛技术客栈 Linux【Ubuntu】修改ssh默认端口 - OXOXTECH 牛牛技术客栈 设计模式-迭代器模式 - OXOXTECH 牛牛技术客栈 scheduled定时任务的三种基本实现方式 - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(三) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(二) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(一) - OXOXTECH 牛牛技术客栈 基于JavaFX的桌面端网络调试工具 - OXOXTECH 牛牛技术客栈 Golang Channel的原理介绍 - OXOXTECH 牛牛技术客栈 Go语言Map的原理分析 - OXOXTECH 牛牛技术客栈 Go语言错误处理(panic)的最佳实践 - OXOXTECH 牛牛技术客栈 设计模式-解释器模式 - OXOXTECH 牛牛技术客栈 Redis报错Redis is configured to save RDB snapshots, but it's currently unable to persist to disk. go-webpbin库在Linux报错failed to encode image to WebP: exit status 1.......的问题 exe4j 打包加密的jar - OXOXTECH 牛牛技术客栈 Go生成图形验证码示例 - OXOXTECH 牛牛技术客栈 澳门一天游:一日尽享东方与西方的交融之美 - OXOXTECH 牛牛技术客栈 设计模式-命令模式 - OXOXTECH 牛牛技术客栈 别再自己瞎写工具类了,SpringBoot内置工具类应有尽有 - OXOXTECH 牛牛技术客栈 中山一日游 - OXOXTECH 牛牛技术客栈 设计模式-责任链模式 - OXOXTECH 牛牛技术客栈 起舞吧,齐舞吧 - OXOXTECH 牛牛技术客栈 设计模式-组合模式 - OXOXTECH 牛牛技术客栈 Go语言Web开发|GoFrame框架入门笔记 - OXOXTECH 牛牛技术客栈 Java打包exe教程 - OXOXTECH 牛牛技术客栈 设计模式-代理模式 - OXOXTECH 牛牛技术客栈 MySQL存储过程的优缺点有哪些? - OXOXTECH 牛牛技术客栈 前端渲染优化有哪些? - OXOXTECH 牛牛技术客栈 HTTP状态码及其含义 - OXOXTECH 牛牛技术客栈
内存不足导致Tomcat崩溃问题排查与解决办法 - OXOXTECH 牛牛...
军阁 · 2023-08-02 · via 牛牛技术客栈

军阁 后端 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

然后保存即可