ホームページ >Java >&#&チュートリアル >Java OutOfMemoryError を検出する必要があるのはどのような場合ですか?
Catching java.lang.OutOfMemoryError?
Java のドキュメントでは、java.lang.OutOfMemoryError を含む java.lang.Error をキャッチしないようアドバイスしています。ただし、そうすることが正当化される状況もあります。
OutOfMemoryError をキャッチするタイミング
正常に終了し、リソースを解放し、障害原因をログに記録する場合にのみ、OutOfMemoryError をキャッチすることを検討してください。これは、ヒープ リソースが不十分なためにブロック メモリの割り当てが失敗した場合に発生します。それでも、ヒープには割り当てられたオブジェクトがまだ含まれています。ランタイム オブジェクトへの参照を削除することで、クリーンアップのためにより多くのメモリを解放できます。
Catch ハンドラでのメモリ割り当ての回避
Catch ハンドラでのさらなるメモリ割り当てを回避するには、次のことを考慮してください。 :
コード例
次のコードは、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 サイトの他の関連記事を参照してください。