Java.lang.OutOfMemoryErrorの取得:Java Jboss 7のヒープスペースjboss設定のエントリは
set "Java_OPTS=-Xms1G -Xmx2G -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=2096M"
エラーは
Java.lang.OutOfMemoryError: Java heap space
at Java.util.Arrays.copyOf(Arrays.Java:3332) [rt.jar:1.8.0_231]
at Java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.Java:124) [rt.jar:1.8.0_231]
at Java.lang.AbstractStringBuilder.append(AbstractStringBuilder.Java:448) [rt.jar:1.8.0_231]
at Java.lang.StringBuffer.append(StringBuffer.Java:270) [rt.jar:1.8.0_231]
at Java.io.StringWriter.write(StringWriter.Java:112) [rt.jar:1.8.0_231]
at Java.io.PrintWriter.write(PrintWriter.Java:456) [rt.jar:1.8.0_231]
at Java.io.PrintWriter.write(PrintWriter.Java:473) [rt.jar:1.8.0_231]
at Java.io.PrintWriter.print(PrintWriter.Java:603) [rt.jar:1.8.0_231]
at Java.io.PrintWriter.println(PrintWriter.Java:756) [rt.jar:1.8.0_231]
at Java.lang.Throwable$WrappedPrintWriter.println(Throwable.Java:765) [rt.jar:1.8.0_231]
at Java.lang.Throwable.printEnclosedStackTrace(Throwable.Java:698) [rt.jar:1.8.0_231]
at Java.lang.Throwable.printEnclosedStackTrace(Throwable.Java:710) [rt.jar:1.8.0_231]
JBossにデプロイされたアプリケーションによっては、2 GBのヒープでも十分ではない場合があります。潜在的な問題:
Xmx
構成が適用されていません(構成が間違ったファイルで行われています)WindowsでJBossを実行する場合は、standalone.conf.bat
変数のJava_OPTS
ファイルに、次の値-Xmx2G -XX:MaxMetaspaceSize=1G
を設定します。
standalone.conf
ファイルはWindowsでは無視され、* nixシステムにのみ適用されます。
JConsole (JDKの一部)または JVisualVM を使用してJVMに接続し、これらの値が適用されていることを確認します。
これらのツールを使用して、ヒープの使用状況を監視し、さらにヒープが必要かどうかを確認できます。
ヒープサイズが十分に大きく(4 GB以上など)、ガベージコレクション(GC)が領域を解放していない間にヒープが引き続き増加し続ける場合、メモリリークが発生している可能性があります。
分析のために、Java_OPTS
に次のフラグを追加します:-Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError
。
これらのフラグを使用すると、JVMはGCアクティビティをgc.log
ファイルに記録し、GC後に解放されたスペースの量を明示的に確認できます。
ログに従ってその後のGCを実行してもスペースが解放されない場合は、おそらくメモリリークがあり、JVisualVMを使用して手動で作成した、またはOutOfMemoryError
でJVM自体によって作成したヒープダンプを分析する必要があります。ヒープダンプは、JVisualVMまたは Eclipse Memory Analyzer(MAT) を使用して分析できます。
通常、このエラーは、Javaヒープにオブジェクトを割り当てるための十分なスペースがない場合にスローされます。この場合、ガベージコレクターは新しいオブジェクトを収容するためにスペースを利用できず、ヒープはさらに拡大されます。
以下の可能な修正手順を実行してくださいJava.lang.OutOfMemoryError
。
ステップ1:JBoss構成設定を確認します。設定はシステム構成によって異なりますJavaバージョンとJBossバージョン。構成を確認してください ここ )。
ステップ2:ヒープダンプ設定を確認します ここ 。
ステップ3:Javaコード/ライブラリの問題。
メモリを分析する ここ そして Jbossメモリプロファイラ 。
このOutOfMemoryErrorメッセージの他の原因はより複雑で、プログラミングエラーが原因です。
Java.lang.OutOfMemoryError:OutOfMemoryErrorは通常、何らかの問題、つまり構成の問題(指定されたヒープサイズがアプリケーションに対して不十分である)を実行していることを意味しますまたは、オブジェクトを長く保持しすぎる(オブジェクトがガベージコレクションされるのを防ぐ)か、一度に大量のデータを処理しようとしています。
可能なソリューション:
1) "Java_OPTS = -Xms1G -Xmx1G -XX:MaxPermSize = 256M"を最大値に設定して、サーバーを再起動してみてください。
2)メモリリークがないかコードを確認します。ヒープダンプリーダーを使用して同じことを確認します。 (Eclipse、IntelliJなどのIDEで利用可能な複数のプラグインがあります)
3)コードを確認します(問題の90%はコード内にあります):データベースまたはその他のソースからヒープメモリに過剰なデータをロードしているかどうか、およびそれが本当に必要かどうかを確認します。複数のWebサービスと複数のDB読み取り専用操作を呼び出す場合は、dbクエリ(結合が正しいwhere句で完全に使用されている場合)とdbクエリとWebサービスから返されたデータの量を確認します。
4)問題が最近のコード変更に起因する場合は、同じことを分析してみてください。
5)また、キャッシュとセッションの要素が一度使用されるとクリアされるかどうかを確認します。
6)問題がJbossによるものではないことを確認するために、テスト目的で他のサーバーで同じコードを実行できます(Tomcat、Websphereなど)。
7)メモリ不足エラーの詳細については、Javaドキュメントを確認してください: Documentation Link
また、プロセスを監視し、jvisualvm(jdkに含まれています)を実行してUIが開き、そこから多くの情報を取得できます。
これがお役に立てば幸いです。