java.lang.OutOfMemoryError: PermGen 解決方案

異常信息

java.lang.OutOfMemoryError: PermGen

這個異常是由JVM 內存中的永久代(PermGen)內存溢出或內存泄露導致的,而永久代(PermGen)在JDK8之後由元空間替代,永久代被廢棄。

爲什麼要廢棄永久代(PermGen)呢?

官方是這麼解釋的:

This is part of the JRockit and Hotspot convergence effort. JRockit customers do not need to configure the permanent generation (since JRockit does not have a permanent generation) and are accustomed to not configuring the permanent generation.

大概的意思:移除永久代是爲融合HotSpot JVM與 JRockit VM而做出的努力,因爲JRockit沒有永久代,不需要配置永久代。

現實使用中易出問題:

由於永久代內存經常不夠用或發生內存泄露,爆出異常java.lang.OutOfMemoryError: PermGen

解決方法

1.手動設置MaxPermSiz(不推薦)

手動設置MaxPermSize大小修改TOMCAT_HOME/bin/catalina.bat(windows系統)或者catalina.sh(unix系統)在“echo “Using CATALINA_BASE: $CATALINA_BASE””上面加入以下行:set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=256M -XX:MaxPermSize=512m

2.升級到JDK8及以上(推薦)

這個方法是最有用的方式了,因爲永久代在JDK8以後被廢棄了,替換爲元空間,這樣的問題就不會再出現了。

對了,永久代和元空間都是JVM內存中方法區的一種實現。

這是之前工作中遇到的一個坑,分享一下。

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