ホームページ  >  記事  >  Java  >  jvm メモリ オーバーフローの解決策 (jvm メモリ オーバーフローを解決する方法)

jvm メモリ オーバーフローの解決策 (jvm メモリ オーバーフローを解決する方法)

高洛峰
高洛峰オリジナル
2017-01-23 10:09:231215ブラウズ

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 がクラスをまったく収集できないことです。

1 ヒープ サイズの値は、起動時に自動的に設定されます。その初期スペース (つまり、-Xms) は物理メモリの 1/64、最大スペース (-Xmx) は物理メモリの 1/4 です。 -Xmn -Xms -Xmx および JVM によって提供されるその他のオプションを使用して設定できます。ヒープ サイズのサイズは、Young Generation と Tenured Generation の合計です。

ヒント: 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

または catalina.sh を変更します

「echo」 CATALINA_BASE の使用: $CATALINA_BASE""次の行を上に追加します:

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

catalina.sh と下:

JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"

jvm メモリ オーバーフロー ソリューション (jvm メモリ オーバーフローを解決する方法) 関連記事の詳細については、PHP 中国語 Web サイトに注目してください。 !

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。