web-dev-qa-db-ja.com

Java.lang.OutOfMemoryErrorを取得しています:Java Jbossのヒープ領域

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]
3
Rajeev Ranjan

JBossにデプロイされたアプリケーションによっては、2 GBのヒープでも十分ではない場合があります。潜在的な問題:

  1. Xmx構成が適用されていません(構成が間違ったファイルで行われています)
  2. アプリケーションはより多くのヒープを必要とするだけです
  3. アプリケーションにメモリリークがあります

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) を使用して分析できます。

0
Evgeniy Khyst

通常、このエラーは、Javaヒープにオブジェクトを割り当てるための十分なスペースがない場合にスローされます。この場合、ガベージコレクターは新しいオブジェクトを収容するためにスペースを利用できず、ヒープはさらに拡大されます。

以下の可能な修正手順を実行してくださいJava.lang.OutOfMemoryError

ステップ1:JBoss構成設定を確認します。設定はシステム構成によって異なりますJavaバージョンとJBossバージョン。構成を確認してください ここ )。

ステップ2:ヒープダンプ設定を確認します ここ

ステップ3:Javaコード/ライブラリの問題。

メモリを分析する ここ そして Jbossメモリプロファイラ

このOutOfMemoryErrorメッセージの他の原因はより複雑で、プログラミングエラーが原因です。

0
Naresh Kumar

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

0
Shailesh Yadav

また、プロセスを監視し、jvisualvm(jdkに含まれています)を実行してUIが開き、そこから多くの情報を取得できます。

これがお役に立てば幸いです。

0
pioardi