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


96

マルチスレッドプログラムの実行時に次のエラーが発生する

java.lang.OutOfMemoryError: Java heap space

上記のエラーは、いずれかのスレッドで発生しました。

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

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

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


回答:


104

ヒープ領域を増やしたい場合java -Xms<initial heap size> -Xmx<maximum heap size>は、コマンドラインで使用できます。デフォルトでは、値はJREのバージョンとシステム構成に基づいています。あなたは見つけることができますJavaのWebサイト上のVMオプションの詳細については

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


1
Netbeansを使用していますが、プロファイラーの使用方法がわかりません。プロファイラを使用してアプリケーションのメモリリークを見つけることができるように、プロファイラについて詳しく知りたいのですが。
Yatendra Goel、

NetBeansサイト(profiler.netbeans.org)のページへのリンクを追加しました。このページには、非常に基本的な使用からより高度な使用まで、プロファイルに関する非常に優れたドキュメントがあります。
Thomas Owens、

デフォルト値はJavaのバージョンによって異なります。この情報を回答に含めると便利です。
Dariusz

同様の問題を修正して最初に試したところ:java -jar Division.jar -Xmx512m -Xms512m-これは同じエラーになりますが、次のようにすると:java -Xmx512m -Xms512m -jar Division.jar-すべて問題ありません。したがって、paramsの順序も重要です。
ヒポキト2016年

@hipokito jarファイルがargs []としてjarファイルのmain()メソッドに渡された後の引数
Asu

29

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を使用してプロファイルを作成し、記憶がどこに行くのかを調べることができます


while which(true);)
Gal Bracha 14

8

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

何を変更するかを決定するために、visualgcを使用して、メモリモデルのさまざまな部分がどのように満たされているかを監視することが有用であることがわかりました。

メモリのどの部分がいっぱいになったかを判断することは難しいため、問題を抱えている部分だけを変更したい場合があります。

いいね!1GのRAMをJVMに与えます。

何をしているのかをより正確に考えてみてください。長期的に見れば、おそらくそのプログラムの方が適しているでしょう。

メモリリークの可能性がある場所を特定するには、テストの前と後のメモリをテストすることで、ユニットテストを使用できます。また、変更が大きすぎる場合は、それを調べることもできますが、テストの実行中にチェックを行います。


6

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

-Xmx256M


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

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

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

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

はい。このオラクルの記事をご覧ください詳細についてはをご覧ください。

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

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

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

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

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

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

  2. アプリケーションでメモリリークを発生させない

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

オラクルの記事からの重要な注意事項

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

考えられる理由:

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

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

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


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

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


3
  1. ローカル変数はスタック上にあります。ヒープ領域がオブジェクトで占有されています。

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

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


1

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


1

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

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.