マルチスレッドプログラムの実行時に次のエラーが表示されます
Java.lang.OutOfMemoryError: Java heap space
上記のエラーは、スレッドの1つで発生しました。
私の知る限り、ヒープ領域はインスタンス変数のみで占められています。これが正しい場合、インスタンス変数のスペースがオブジェクト作成時に割り当てられるため、しばらくの間正常に実行した後にこのエラーが発生した理由。
ヒープ領域を増やす方法はありますか?
ヒープスペースを少なくするために、プログラムにどのような変更を加える必要がありますか?
ヒープ領域を増やしたい場合は、コマンドラインでJava -Xms<initial heap size> -Xmx<maximum heap size>
を使用できます。デフォルトでは、値はJREバージョンとシステム構成に基づいています。 VMウェブサイトのJavaオプションの詳細 をご覧ください。
ただし、アプリケーションをプロファイリングして、ヒープサイズが消費されている理由を調べることをお勧めします。 NetBeansには 非常に優れたプロファイラー が含まれています。ボンネットの下で jvisualvm
を使用していると思います。プロファイラーを使用すると、多くのオブジェクトが作成されている場所、オブジェクトがガベージコレクションされたときなどを見つけることができます。
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を使用してプロファイルを作成し、記憶がどこに向かっているかを調べることができます。
JVMのメモリの詳細については、次のサイトをご覧ください。 http://developer.streamezzo.com/content/learn/articles/optimization-heap-memory-usage
visualgc を使用して、メモリモデルのさまざまな部分がどのようにいっぱいになるかを監視し、何を変更するかを判断すると便利です。
メモリのどの部分がいっぱいになったのかを判断することは難しいため、visualgcを使用します。
いいね! JVMに1GのRAMを渡します。
あなたが何をしているのかをより正確にしようとすると、長い目で見ればおそらくプログラムがより良いと思うでしょう。
メモリリークが発生する可能性のある場所を判断するには、テストの前後にメモリが何であったかをテストすることで、そのための単体テストを使用できます。変更が大きすぎる場合は、調査する必要がありますが、テストの実行中にチェックを行います。
ヒープサイズを増やすには、Javaの起動時に-Xmx引数を使用できます。例えば.
-Xmx256M
- 私の知る限り、ヒープ領域はインスタンス変数のみで占められています。これが正しい場合、インスタンス変数のスペースがオブジェクト作成時に割り当てられるため、しばらく正常に実行した後にこのエラーが発生した理由。
これは、一定期間にわたってアプリケーション内でより多くのオブジェクトを継続的に作成していることを意味します。新しいオブジェクトはヒープメモリに格納されるため、ヒープメモリが増加します。
ヒープにはインスタンス変数が含まれるだけではありません。すべての非プリミティブデータ型(オブジェクト)を格納します。これらのオブジェクトの寿命は、短い(メソッドブロック)または長い(オブジェクトがアプリケーションで参照されるまで)場合があります。
- ヒープ領域を増やす方法はありますか?
はい。詳細については、このOracle article をご覧ください。
ヒープサイズを設定するための2つのパラメーターがあります。
-Xms:、初期および最小ヒープサイズを設定します
-Xmx:、最大ヒープサイズを設定します
- ヒープスペースを少なくするために、プログラムにどのような変更を加える必要がありますか?
アプリケーションによって異なります。
アプリケーションの要件に従って最大ヒープメモリを設定します。
アプリケーションでメモリリークを引き起こさないでください
アプリケーションでメモリリークが見つかった場合は、 MAT 、 Visual VM 、 jconsole などのプロファイリングツールを使用して根本原因を見つけます。根本的な原因を見つけたら、リークを修正します。
Oracleからの重要な注意事項 記事
原因:詳細メッセージJavaヒープスペースは、Javaヒープにオブジェクトを割り当てることができなかったことを示しています。このエラーは、必ずしもメモリリークを意味するものではありません。
考えられる理由:
別の注意として、より良いガベージコレクションアルゴリズムを使用してください(CMSまたはG1GC)
これを見てください 質問 G1GCを理解するために
以下のプログラムでヒープメモリサイズを取得できます。
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
ほとんどの場合、コードは最適化されていません。これ以上必要でないと思われるオブジェクトをリリースします。毎回ループ内でオブジェクトを作成しないでください。キャッシュを使用してみてください。アプリケーションがどのように処理されているのかわかりません。しかし、プログラミングでは、通常の生活の1つのルールも適用されます
治療よりも予防が大切です。 「不要なオブジェクトを作成しないでください」
ローカル変数はスタック上にあります。ヒープスペースはオブジェクトによって占有されています。
-Xmx
オプションを使用できます。
基本的に、ヒープスペースはnew
で新しいオブジェクトを割り当てるたびに使い果たされ、オブジェクトが参照されなくなってからしばらくして解放されます。そのため、不要になったオブジェクトへの参照を保持しないようにしてください。
いいえ、スタックスペースを考えていると思います。ヒープ領域はオブジェクトによって占有されています。増やす方法は-Xmx256mで、256をコマンドラインで必要な量に置き換えます。
この例外を回避するには、JUnitとSpringを使用している場合、すべてのテストクラスにこれを追加してみてください。
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
Netbeansで、「実行」ツールバーに移動->「プロジェクト構成の設定」->「カスタマイズ」->ポップアップウィンドウの「実行」->「VMオプション」->「-Xms2048m」を入力-Xmx2048m '。ヒープサイズの問題を解決できます。