Tomcat假死问题排查:java.lang.OutOfMemoryError: PermGen space

电子化上线了一个新版规范以后,竟然给我抛出一个我都没想到的异常,昨晚临近下班的时候,一个业务员打电话说电子化系统点击无反应,我去生产试了试,果然如此,换了几个浏览器,登陆的时候都是在转圈圈(等待响应)。。赶紧登陆服务器查了查,尼玛,进程还在呀?怎么感觉像Tomcat死了呢?这个就是所谓的Tomcat假死了。什么原因呢?

Tomcat假死问题排查:java.lang.OutOfMemoryError: PermGen space_第1张图片

赶紧打开日志,我擦,java.lang.OutOfMemoryError: PermGen space,竟然内存溢出??立即打开Tomcat目录的bin目录下,打开catalina.sh查看,不知道是哪个家伙竟然把内存分配的语句给删了,看了一下文件修改日期,这个文件最后修改时间是2019年12月,MMP,这不内存溢出,也是阿弥陀佛了。

Tomcat假死问题排查:java.lang.OutOfMemoryError: PermGen space_第2张图片

最早的时候,这个文件是有内存分配管理的,不知道是不是中间由7升级Tomcat8的时候,被机房管理人员顺带把这个文件换了,感紧添加语句:

JAVA_OPTS="-Xms2048m -Xmx2048m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=256m"

之前一篇文章叫Tomcat内存调整和默认线程池调整也介绍过,如何调整内存,我这里采取1/4原则,配置好以后,重启Tomcat,Tomcat假死的问题得以解决(这个内存溢出的解决办法首先就是加大内存,其次再考虑代码问题),首先保证生产可用,今天就拷贝了日志,详细记录一下如何分析这个问题。

PermGen space的全称是Permanent Generation space,代表内存的永久保存区域,这一部分OOM,那肯定是永久保存区内存不足了,这一部分是用来干嘛的呢?

这一部分是用于存放Class和Meta的信息,Class在被加载的时候会放入PermGen space区域进行管理,而且GC不会在主程序运行期对PermGen space进行清理,所以如果你的加载很多Class的话,就很可能出现PermGen space错误,而且这种错误常见在web服务器对JSP进行预编译的时候。

再结合这次上线的过程分析,此次上线的确加了很多功能,由于系统架构限制,也加了很多Jsp,再加之未对内存分配进行管理,出现这个报错,也不奇怪。网上查了资料,在Tomcat中重新调配(redeploy)时出现OOM的错误,有以下几个方面的原因: 
1)使用了proxool(内部包含了一个老版本的cglib)
2)更新Cglib到最新,更新Hibernate到最新

你可能感兴趣的:(Error)