Tomcat假死問題排查:java.lang.OutOfMemoryError: PermGen space

電子化上線了一個新版規範以後,竟然給我拋出一個我都沒想到的異常,昨晚臨近下班的時候,一個業務員打電話說電子化系統點擊無反應,我去生產試了試,果然如此,換了幾個瀏覽器,登陸的時候都是在轉圈圈(等待響應)。。趕緊登陸服務器查了查,尼瑪,進程還在呀?怎麼感覺像Tomcat死了呢?這個就是所謂的Tomcat假死了。什麼原因呢?

趕緊打開日誌,我擦,java.lang.OutOfMemoryError: PermGen space,竟然內存溢出??立即打開Tomcat目錄的bin目錄下,打開catalina.sh查看,不知道是哪個傢伙竟然把內存分配的語句給刪了,看了一下文件修改日期,這個文件最後修改時間是2019年12月,MMP,這不內存溢出,也是阿彌陀佛了。

最早的時候,這個文件是有內存分配管理的,不知道是不是中間由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到最新

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章