MENU

java应用服务器内存溢出自动重启脚本

2017 年 01 月 20 日 • 杂乱文章

内存溢出:java.lang.OutOfMemoryError: PermGen space,相信大家对这个并不陌生,像是各种java应用服务器,比如resin、tomcat、或是jetty,到目前为止我用过的就这三个,只要是java应用服务器,都有可能出现这个问题,最常见的原因就是因为JVM分配的内存太小,当然也会有很多别的原因,java这块我不是很懂,我的任务就是将应用服务器调试到适当的内存,每次出现内存溢出之后尽快的恢复故障,虽然zabbix有邮件报警,但是我也不可能一天24小时盯着邮件看,因为之前出过这种情况,大半夜内存溢出了,然后我也没看见,第二天才看到,早晨起来之后才开始搞的,虽然正常情况下内存溢出的几率很小,有备无患吧。尤其是最近,测试服新了N多项目,而且开发的更新jar包或是新上项目,都不会停掉服务器,而是直接传,有时候直接会导致内存溢出,然后叫我重启服务器,我受够了,今天没什么事,写了个脚本来解决这个问题。

脚本内容

#!/bin/bash
while true
do
  if [ `tail -n 50 /data/logs/resin/jvm-app-0.log | grep OutOfMemory | wc -l` -ne 0 ];then
    ps aux | grep resin | grep -v grep | awk {'print $2'} | xargs kill -9
      /etc/init.d/resin start
    fi
  sleep 30
done

这个脚本其实很简单,就是判断了一下JVM日志后50行有没有OutOfMemory这个关键字,如果有绝逼是内存溢出了,直接杀,杀了再起,如果没有,30秒后再次执行即可,注意你的脚本名字不要带有检索进程的字段,否则也会被杀,譬如resin.sh,如果你要用的话就是把日志路径、要杀的进程名字,还有启动方式改了就可以了,上面是以resin为例,tomcat的实时日志文件是catalina.out,就不多BB了。

其实还是建议加到计划任务里面,每分钟执行一次即可,如果加到计划任务就把while true语句删掉,只留if判断就够了。

*/1 * * * * /bin/bash /scripts/check.sh > /dev/null 2>&1 &
最后编辑于: 2018 年 12 月 10 日
返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码