web-dev-qa-db-ja.com

java.lang.OutOfMemoryError:Javaヒープスペース

マルチスレッドプログラムの実行時に次のエラーが表示されます

Java.lang.OutOfMemoryError: Java heap space

上記のエラーは、スレッドの1つで発生しました。

  1. 私の知る限り、ヒープ領域はインスタンス変数のみで占められています。これが正しい場合、インスタンス変数のスペースがオブジェクト作成時に割り当てられるため、しばらくの間正常に実行した後にこのエラーが発生した理由。

  2. ヒープ領域を増やす方法はありますか?

  3. ヒープスペースを少なくするために、プログラムにどのような変更を加える必要がありますか?

92
Yatendra Goel

ヒープ領域を増やしたい場合は、コマンドラインでJava -Xms<initial heap size> -Xmx<maximum heap size>を使用できます。デフォルトでは、値はJREバージョンとシステム構成に基づいています。 VMウェブサイトのJavaオプションの詳細 をご覧ください。

ただし、アプリケーションをプロファイリングして、ヒープサイズが消費されている理由を調べることをお勧めします。 NetBeansには 非常に優れたプロファイラー が含まれています。ボンネットの下で jvisualvm を使用していると思います。プロファイラーを使用すると、多くのオブジェクトが作成されている場所、オブジェクトがガベージコレクションされたときなどを見つけることができます。

98
Thomas Owens

1.-はい。ただし、プログラムで使用されるメモリ全体を指します。

2.-はいJava VMオプションを参照してください

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size

すなわち

Java -Xmx2gは、最大2 GBのRAMをアプリに割り当てます

ただし、最初にメモリリークがないかどうかを確認する必要があります。

3.-プログラムに依存します。スポットメモリリークを試してください。この質問は答えるのが難しいでしょう。最近、JConsoleを使用してプロファイルを作成し、記憶がどこに向かっているかを調べることができます。

25
OscarRyz

JVMのメモリの詳細については、次のサイトをご覧ください。 http://developer.streamezzo.com/content/learn/articles/optimization-heap-memory-usage

visualgc を使用して、メモリモデルのさまざまな部分がどのようにいっぱいになるかを監視し、何を変更するかを判断すると便利です。

メモリのどの部分がいっぱいになったのかを判断することは難しいため、visualgcを使用します。

いいね! JVMに1GのRAMを渡します。

あなたが何をしているのかをより正確にしようとすると、長い目で見ればおそらくプログラムがより良いと思うでしょう。

メモリリークが発生する可能性のある場所を判断するには、テストの前後にメモリが何であったかをテストすることで、そのための単体テストを使用できます。変更が大きすぎる場合は、調査する必要がありますが、テストの実行中にチェックを行います。

8
James Black

ヒープサイズを増やすには、Javaの起動時に-Xmx引数を使用できます。例えば.

-Xmx256M
6
Adamski
  1. 私の知る限り、ヒープ領域はインスタンス変数のみで占められています。これが正しい場合、インスタンス変数のスペースがオブジェクト作成時に割り当てられるため、しばらく正常に実行した後にこのエラーが発生した理由。

これは、一定期間にわたってアプリケーション内でより多くのオブジェクトを継続的に作成していることを意味します。新しいオブジェクトはヒープメモリに格納されるため、ヒープメモリが増加します。

ヒープにはインスタンス変数が含まれるだけではありません。すべての非プリミティブデータ型(オブジェクト)を格納します。これらのオブジェクトの寿命は、短い(メソッドブロック)または長い(オブジェクトがアプリケーションで参照されるまで)場合があります。

  1. ヒープ領域を増やす方法はありますか?

はい。詳細については、このOracle article をご覧ください。

ヒープサイズを設定するための2つのパラメーターがあります。

-Xms:、初期および最小ヒープサイズを設定します

-Xmx:、最大ヒープサイズを設定します

  1. ヒープスペースを少なくするために、プログラムにどのような変更を加える必要がありますか?

アプリケーションによって異なります。

  1. アプリケーションの要件に従って最大ヒープメモリを設定します。

  2. アプリケーションでメモリリークを引き起こさないでください

  3. アプリケーションでメモリリークが見つかった場合は、 MATVisual VMjconsole などのプロファイリングツールを使用して根本原因を見つけます。根本的な原因を見つけたら、リークを修正します。

Oracleからの重要な注意事項 記事

原因:詳細メッセージJavaヒープスペースは、Javaヒープにオブジェクトを割り当てることができなかったことを示しています。このエラーは、必ずしもメモリリークを意味するものではありません。

考えられる理由:

  1. 不適切な構成(十分なメモリを割り当てていません)
  2. アプリケーションが意図せずにオブジェクトへの参照を保持しているため、オブジェクトがガベージコレクションされない
  3. ファイナライザーを過度に使用するアプリケーション。クラスにfinalizeメソッドがある場合、そのタイプのオブジェクトには、ガベージコレクション時にスペースが再利用されません。 ファイナライザスレッドがファイナライズキューに追いつかない場合、Javaヒープがいっぱいになり、このタイプのOutOfMemoryError例外がスローされます

別の注意として、より良いガベージコレクションアルゴリズムを使用してください(CMSまたはG1GC

これを見てください 質問 G1GCを理解するために

6
Ravindra babu

以下のプログラムでヒープメモリサイズを取得できます。

public class GetHeapSize {
    public static void main(String[] args) {
        long heapsize = Runtime.getRuntime().totalMemory();
        System.out.println("heapsize is :: " + heapsize);
    }
} 

それに応じて、Java -Xmx2g http://www.Oracle.com/technetwork/Java/javase/tech/vmoptions-jspを使用して、ヒープサイズを増やすこともできます。 -140102.html

6
user2663609
  1. ほとんどの場合、コードは最適化されていません。これ以上必要でないと思われるオブジェクトをリリースします。毎回ループ内でオブジェクトを作成しないでください。キャッシュを使用してみてください。アプリケーションがどのように処理されているのかわかりません。しかし、プログラミングでは、通常の生活の1つのルールも適用されます

    治療よりも予防​​が大切です。 「不要なオブジェクトを作成しないでください」

5
DKSRathore
  1. ローカル変数はスタック上にあります。ヒープスペースはオブジェクトによって占有されています。

  2. -Xmxオプションを使用できます。

  3. 基本的に、ヒープスペースはnewで新しいオブジェクトを割り当てるたびに使い果たされ、オブジェクトが参照されなくなってからしばらくして解放されます。そのため、不要になったオブジェクトへの参照を保持しないようにしてください。

3
sepp2k

いいえ、スタックスペースを考えていると思います。ヒープ領域はオブジェクトによって占有されています。増やす方法は-Xmx256mで、256をコマンドラインで必要な量に置き換えます。

1
Yishai

この例外を回避するには、JUnitとSpringを使用している場合、すべてのテストクラスにこれを追加してみてください。

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
0
Aliuk

Netbeansで、「実行」ツールバーに移動->「プロジェクト構成の設定」->「カスタマイズ」->ポップアップウィンドウの「実行」->「VMオプション」->「-Xms2048m」を入力-Xmx2048m '。ヒープサイズの問題を解決できます。

0
Xiaogang