異常信息
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內存中方法區的一種實現。
這是之前工作中遇到的一個坑,分享一下。