大概从上月下旬开始,一个服务老是会出现周末宕机的灵异事件。
每次查看日志文件都没有报错信息,所以就搞了个监控服务定时去请求接口。每次服务异常的时候都自动发邮件给我,然后上服务器去重启项目……今天恰好周末,离开的也比平时更早一些,几乎是准时下班了。结果打开QQ,映入眼帘的是大量邮件提醒。数了数足有三十多封,我定时任务设置的是一分钟,也就是说服务已经挂了半个小时了。【SpringBoot发送模板邮件+定时任务参考:传送门
到家以后紧急登录服务器,把进程kill掉,然后去Tomcat的bin目录下运行./startup.sh重启Tomcat。
提示启动成功,但是ps -ef|grep tomcat查看进程的时候并没有发现该服务,去logs下面cat日志的时候也没有显示错误信息。电话远程求助同事,给出猜测可能是内存满了……随即(logs目录下)tail -f catalina.out查看日志文件,果然控制台提示:

# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 1431830528 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /usr/local/software/apache-tomcat-7.0.96/bin/hs_err_pid16598.log

然后手动清空了catalina.out释放磁盘空间。

df -h #查看磁盘占用的空间
du -h catalina.out #查看catalina.out文件大小
cat /dev/null >catalina.out #清空catalina.out文件内容

并修改Tomcat配置文件(减少给jvm分配的内存):
Tomcat的bin目录下catalina.sh的第108行,在中间加上下面的这段配置即可:

#OS specific support. $var _must_ be set to either true or false.  
JAVA_OPTS="-server -Xms256m -Xmx512m  -XX:PermSize=128m -XX:MaxPermSize=256m"
cygwin=false

然后去Tomcat的bin目录下运行./startup.sh重启Tomcat,服务运行成功。

最后修改:2022 年 05 月 27 日
给我一点小钱钱也很高兴啦!o(* ̄▽ ̄*)ブ