ホームページ > Java > &#&チュートリアル > Java OutOfMemoryError を検出する必要があるのはどのような場合ですか?

Java OutOfMemoryError を検出する必要があるのはどのような場合ですか?

Barbara Streisand
リリース: 2024-12-31 14:51:09
オリジナル
268 人が閲覧しました

When Should You Catch a Java OutOfMemoryError?

Catching java.lang.OutOfMemoryError?

Java のドキュメントでは、java.lang.OutOfMemoryError を含む java.lang.Error をキャッチしないようアドバイスしています。ただし、そうすることが正当化される状況もあります。

OutOfMemoryError をキャッチするタイミング

正常に終了し、リソースを解放し、障害原因をログに記録する場合にのみ、OutOfMemoryError をキャッチすることを検討してください。これは、ヒープ リソースが不十分なためにブロック メモリの割り当てが失敗した場合に発生します。それでも、ヒープには割り当てられたオブジェクトがまだ含まれています。ランタイム オブジェクトへの参照を削除することで、クリーンアップのためにより多くのメモリを解放できます。

Catch ハンドラでのメモリ割り当ての回避

Catch ハンドラでのさらなるメモリ割り当てを回避するには、次のことを考慮してください。 :

  • 手動メモリ管理:直接メモリ アクセスには Unsafe クラスを使用し、Java ガベージ コレクションのオーバーヘッドを回避します。
  • スレッド コンテキスト: 例外処理用に専用のメモリ領域を持つ別のスレッドを使用し、メイン スレッドからのメモリ リークを防ぎます。 .
  • 外部リソース処理: メモリ割り当てを回避するために、リソースの解放をログ フレームワークなどの外部エンティティに委任します。

コード例

次のコードは、OutOfMemoryError をキャッチし、クリーンアップのためにメモリを解放する方法を示しています。

import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;

public class OutOfMemoryErrorHandling {

    private static final int MEGABYTE = (1024 * 1024);

    public static void main(String[] args) {
        MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();

        for (int i = 1; i <= 100; i++) {
            try {
                byte[] bytes = new byte[MEGABYTE * 500];
            } catch (OutOfMemoryError e) {
                // Cleanup operations:
                // Drop references to runtime objects
                // Release external resources (e.g., logging)

                MemoryUsage heapUsage = memoryBean.getHeapMemoryUsage();
                long maxMemory = heapUsage.getMax() / MEGABYTE;
                long usedMemory = heapUsage.getUsed() / MEGABYTE;
                System.out.println(i + " : Memory Use :" + usedMemory + "M/" + maxMemory + "M");
            }
        }
    }
}
ログイン後にコピー

結論

キャッチOutOfMemoryError には細心の注意を払い、正常な終了を促進する目的でのみ対処する必要があります。 catch ハンドラーでメモリ割り当てを慎重に管理することで、さらなるメモリ問題を回避し、JVM が終了する前に適切なクリーンアップを可能にすることができます。

以上がJava OutOfMemoryError を検出する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート