java.lang.OutOfMemoryError
例外をデバッグする最良の方法は何ですか?
メッセージのOutOfMemoryError
説明でエラーの種類を説明します。例外を処理するには、エラー メッセージの説明を確認する必要があります。
メモリ不足の例外にはさまざまな根本原因があります。詳細については、Oracle のドキュメントページを参照してください。
java.lang.OutOfMemoryError: Java heap space
:
原因: Java ヒープ領域の詳細メッセージは、Java ヒープにオブジェクトを割り当てることができなかったことを示しています。
java.lang.OutOfMemoryError: GC Overhead limit exceeded
:
原因:詳細メッセージ「GC オーバーヘッド制限を超えました」は、ガベージ コレクターが常に実行されており、Java プログラムの進行が非常に遅いことを示しています。
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
:
原因: 詳細メッセージ「要求された配列サイズが VM 制限を超えています」は、アプリケーション (またはそのアプリケーションで使用される API) がヒープ サイズより大きい配列を割り当てようとしたことを示しています。
java.lang.OutOfMemoryError: Metaspace
:
原因: Java クラス メタデータ (Java クラスの仮想マシン内部プレゼンテーション) がネイティブ メモリ (ここではメタスペースと呼ばれます) に割り当てられています。
java.lang.OutOfMemoryError: request size bytes for reason. Out of swap space?
:
原因:詳細メッセージ「request size bytes for reason.Out of swap space?」はOutOfMemoryError
例外のようです。ただし、Java HotSpot VM コードは、ネイティブ ヒープからの割り当てが失敗し、ネイティブ ヒープがほぼ枯渇している可能性がある場合に、この明らかな例外を報告します。
java.lang.OutOfMemoryError: Compressed class space
原因: 64 ビット プラットフォームでは、クラス メタデータへのポインタを 32 ビット オフセットで表すことができます (UseCompressedOops を使用)。これは、コマンド ライン フラグ UseCompressedClassPointers (デフォルトでオン) によって制御されます。
を使用する場合、UseCompressedClassPointers
クラス メタデータに使用できる容量は amount に固定されCompressedClassSpaceSize
ます。に必要なスペースが をUseCompressedClassPointers
超えた場合CompressedClassSpaceSize
、java.lang.OutOfMemoryError
detail Compressed クラス スペースがスローされます。
注:クラス メタデータには複数の種類があります (klass メタデータとその他のメタデータ)。で囲まれたスペースには、klass メタデータのみが格納されCompressedClassSpaceSize
ます。他のメタデータは Metaspace に保存されます。
ヒープ ダンプ ファイルを使用する必要がありますか? Java スレッド ダンプを生成する必要がありますか? 違いは正確には何ですか?
はい。このヒープ ヒープ ダンプ ファイルを使用して、visualvmやmatなどのプロファイリング ツールを使用して問題をデバッグ
できます。スレッド ダンプを使用して、スレッドのステータスに関する詳細な洞察を得ることができます。
違いを知るには、この SE の質問を参照してください。
Websphere での javacore、スレッド ダンプ、ヒープ ダンプの違い
スレッド ダンプを生成する最良の方法は何ですか? kill -3 (私たちのアプリは Solaris で実行されます) は、アプリを強制終了してスレッド ダンプを生成するための最良の方法ですか? アプリを強制終了せずにスレッド ダンプを生成する方法はありますか?
kill -3 <process_id>
スレッド ダンプを生成し、このコマンドは Java プロセスを強制終了しません。