Java
 Computer >> コンピューター >  >> プログラミング >> Java

OutOfMemoryErrorとは何ですか?JavaでOOMの根本的な原因を見つけるための手順は何ですか?


OutOfMemoryError JVMによってスローされます 、JVMに十分な使用可能なメモリがない場合、割り当てる。 OutOfMemoryError Eに分類されます エラーカテゴリ 例外 クラス階層。

OutOfMemoryErrorを生成するには

  • メモリの大きなチャンクを割り当てます。これにより、ヒープメモリストレージが使い果たされます。 。
  • メモリの割り当てを継続し、JVMに割り当てるのに十分なメモリがない場合にポイントが到達し、 OutOfMemoryError スローされます。
  • OutOfMemoryをキャッチしたら エラー、エラーをログに記録できます。

public class OutOfMemoryErrorDemo {
   public static void main(String[] args) throws Exception {
      int dummyArraySize = 15;
      System.out.println("Max JVM memory: " + Runtime.getRuntime().maxMemory());
      long memoryConsumed = 0;
      try {
         long[] memoryAllocated = null;
         for(int loop = 0; loop < Integer.MAX_VALUE; loop++) {
            memoryAllocated = new long[dummyArraySize];
            memoryAllocated[0] = 0;
            memoryConsumed += dummyArraySize * Long.SIZE;
            System.out.println("Memory Consumed till now: " + memoryConsumed);
            dummyArraySize *= dummyArraySize * 2;
            Thread.sleep(500);
         }
      } catch (OutOfMemoryError outofMemory) {
         System.out.println("Catching out of memory error");
         //Log the information, so that we can generate the statistics
         throw outofMemory;
      }
   }
}

出力

Max JVM memory: 119537664
Memory Consumed till now: 960
Memory Consumed till now: 29760
Memory Consumed till now: 25949760
Catching out of memory error
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at OutOfMemoryErrorDemo.main(OutOfMemoryErrorDemo.java:9)


OOMの根本原因を見つける手順

ステップ1:OutOfMemoryErrorでヒープダンプを生成する

VM引数-XX:+ HeapDumpOnOutOfMemoryErrorを使用してアプリケーションを起動します 。これにより、JVMにヒープダンプを生成するように指示されます。 OOMが発生したとき

$ java -XX:+HeapDumpOnOutOfMemoryError ...

ステップ2:問題を再現する

問題を再現できない場合 開発環境で 、本番を使用する必要がある場合があります 環境 。問題を再現し、アプリケーションがOOMをスローすると、ヒープダンプファイルが生成されます。

ステップ3:ヒープダンプファイルを使用して問題を調査します

VisualVMを使用する ヒープダンプファイルを読み取るには 問題を診断します。 VisualVM JDK_HOME/ bin / jvisualvmにあるプログラムです。 。 ヒープダンプファイル アプリケーションのメモリ使用量に関するすべての情報があります。


  1. JavaのJTextFieldとJTextAreaの違いは何ですか?

    JTextFieldの主な違い およびJTextArea Javaでは、 JTextField 1行のテキストを入力できます JTextAreaのGUIアプリケーションで 複数行のテキストを入力できます GUIアプリケーションで。 JTextField JTextFeld は、ユーザーが単一行形式でテキスト値を入力できるようにする最も重要なコンポーネントの1つです。 JTextField ActionListenerを生成します 内部に入力を入力しようとしたときのインターフェース。 JTextComponent JTextFieldのスーパークラスです これは

  2. JavaのJFrameとJDialogの違いは何ですか?

    JFrame フレームに追加されたコンポーネントはそのコンテンツと呼ばれ、 contentPaneによって管理されます。 。 JFrameにコンポーネントを追加するには 、 contentPaneを使用する必要があります 代わりに。 JFrame タイトルのウィンドウが含まれています 、境界線 、(オプション)メニュー バー およびユーザー -指定 コンポーネント 。 JFrame 移動できます 、サイズ変更 、アイコン化 JComponentのサブクラスではありません 。 デフォルトでは、JFrameは左上の角に表示されます 画面のr。指定した場所にフレームを表示するには