大概从上月下旬开始,一个服务老是会出现周末宕机的灵异事件。
每次查看日志文件都没有报错信息,所以就搞了个监控服务定时去请求接口。每次服务异常的时候都自动发邮件给我,然后上服务器去重启项目……今天恰好周末,离开的也比平时更早一些,几乎是准时下班了。结果打开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,服务运行成功。