当前位置:8090社团 >故障解决 > 查看文章
阿里云优惠码

内存溢出: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 &
相关文章
为您推荐
各种观点
暂时还木有人评论,坐等沙发!
发表评论

快捷键:Ctrl+Enter