java.lang.OutOfMemoryError: PermGen space
多くの人が Spring、Hibernate、Tomcat に問題があると考えていることがわかりました。これは、Spring、Hibernate、Tomcat がクラスを動的に生成し、JVM の永続ヒープがオーバーフローするためです。 Tomcat のバージョンを最新バージョンにアップグレードするか、Tomcat をまったく使用しないという別の解決策もあります。 Spring の問題を疑う人もいます。Spring フォーラムでは非常に激しい議論が行われています。これは、Spring が AOP の CBLIB を使用して多くのクラスを動的に生成しているためです。
しかし問題は、なぜこれらのエースのオープンソース製品にも同じ問題があるのかということです。それはもっと根本的な理由なのでしょうか。 Tomcat は、Q&A でこの点について非常に暗黙的に回答しました。私たちはこの問題を認識していますが、この質問はより基本的な質問から生じています。
そこで、誰かがより基本的な JVM をチェックし、問題の鍵を見つけました。 SUN の JVM はメモリをさまざまな領域に分割しており、そのうちの 1 つはパーメンタ領域で、頻繁に使用されるクラスとクラスの説明を格納するために使用されることがわかりました。 SUN が最初に設計したとき、この領域は JVM の開始時に修正されるだろうと考えていましたが、ダイナミックが現在これほど広く使用されるとは予想していませんでした。さらに、この領域には特別なガベージ コレクション メカニズムがあり、問題は、この領域にクラスを動的にロードした後、GC がクラスをまったく収集できないことです。
ヒント: JVM では、時間の 98% が GC に使用され、使用可能なヒープ サイズが 2% 未満の場合、この例外メッセージがスローされます。
ヒント: 最大ヒープ サイズは、使用可能な物理メモリの 80% を超えてはなりません。通常、-Xms オプションと -Xmx オプションは同じ値に設定する必要があり、-Xmn は -Xmx 値の 1/4 にする必要があります。 解決策: ヒープ サイズを手動で設定します TOMCAT_HOME/bin/catalina.bat を変更し、「echo "Using CATALINA_BASE: $CATALINA_BASE"」の上に次の行を追加します:
set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m
JAVA_OPTS="$JAVA_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m" [html] 2、其次是:java.lang.OutOfMemoryError: PermGen space 原因: PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。 解决方法: 1. 手动设置MaxPermSize大小 修改TOMCAT_HOME/bin/catalina.bat(Linux下为catalina.sh),在 [code] “echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m
JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"