103

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

java.lang.OutOfMemoryError: Java heap space

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

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

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

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

4

12 に答える 12

108

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

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

于 2009-10-20T17:08:22.643 に答える
30

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

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

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

つまり

java -Xmx2gアプリに最大2ギガバイトのRAMを割り当てます

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

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

于 2009-10-20T17:09:14.147 に答える
8

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

visualgcを使用して、メモリモデルのさまざまな部分がどのようにいっぱいになっているかを監視し、何を変更するかを決定することが役立つことがわかりました。

単に言うのではなく、問題のある部分を変更したいだけなので、メモリのどの部分がいっぱいになったのか、つまりvisualgcを特定するのは困難です。

罰金!JVMに1GのRAMを割り当てます。

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

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

于 2009-10-20T17:09:33.687 に答える
8

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

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

于 2013-12-18T11:04:35.010 に答える
6

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

-Xmx256M
于 2009-10-20T17:07:18.177 に答える
6
  1. 私の知る限り、ヒープスペースはインスタンス変数のみで占められています。これが正しければ、オブジェクトの作成時にインスタンス変数のスペースが割り当てられるため、しばらくの間正常に実行された後にこのエラーが発生した理由。

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

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

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

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

ヒープサイズを設定するには、次の2つのパラメータがあります。

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

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

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

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

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

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

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

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

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

考えられる理由:

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

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

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

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

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

于 2009-10-22T17:28:39.243 に答える
3
  1. ローカル変数はスタックにあります。ヒープスペースはオブジェクトで占められています。

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

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

于 2009-10-20T17:09:29.420 に答える
1

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

于 2009-10-20T17:07:50.180 に答える
1

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

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
于 2019-01-15T09:00:17.700 に答える
1

私はすべてのソリューションを試しましたが、上記のソリューションでは何も機能しませんでした

解決策:私の場合、4GBのRAMを使用していましたが、RAMの使用量が98%になるため、メモリが利用できない場合に必要な量になります。これも探してください。そのような問題が発生した場合は、RAMをアップグレードして問題なく動作します。

これが誰かの時間を節約することを願っています

于 2021-05-20T12:00:31.707 に答える
0

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

于 2017-06-12T22:49:25.313 に答える