java.lang.OutOfMemoryエラー:Java ヒープ領域
-
22-09-2019 - |
質問
マルチスレッドプログラムの実行時に次のエラーが発生します
java.lang.OutOfMemoryError: Java heap space
上記のエラーがスレッドの 1 つで発生しました。
私の知る限り、ヒープ領域はインスタンス変数のみによって占められています。これが正しい場合、オブジェクトの作成時にインスタンス変数のスペースが割り当てられるため、しばらく正常に実行された後にこのエラーが発生した理由がわかります。
ヒープ領域を増やす方法はありますか?
取得するヒープ領域を少なくするには、プログラムにどのような変更を加える必要がありますか?
解決
は、コマンドライン上でjava -Xms<initial heap size> -Xmx<maximum heap size>
を使用することができます。デフォルトでは、値がJREのバージョンとシステム構成に基づいています。あなたは、JavaのWebサイトの上のVMオプションに関する詳細を見つけることができます。
しかし、私はあなたのヒープサイズが食べられている理由を見つけるために、アプリケーションのプロファイリングをお勧めします。 NetBeansはそれに含まれている非常に良いプロファイラを持っています。私はそれはボンネットの下に jvisualvm
に使用しています信じています。プロファイラを使用すると、オブジェクトが取得するときにゴミを収集し、より多くの、多くのオブジェクトが作成されている場所を見つけることを試みることができます。
他のヒント
1.-はい、それはかなりあなたのプログラムが使用するメモリ全体を指します。
2 .-はいのJava VMオプションを参照してください。
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
すなわち
java -Xmx2g
アサインあなたのアプリへの最大のようにラムの2ギガバイト
しかし、あなたが最初のメモリリークを持っていないかどうかを確認する必要があります。
3.-それはプログラムによって異なります。スポットメモリリークを試してみてください。この質問は答えるのは難しいのだろう。最近、あなたのメモリをしようとしている場所を見つけることを試みるためにJConsoleを使用してプロファイルすることができます。
あなたは、JVMのメモリの詳細については、このサイトを見てみたいことがあります。 http://developer.streamezzo.com/content/learn/articles /最適化ヒープ・メモリ使用量の
私はそれが便利な方法を見て visualgcのを使用することを発見しましたメモリモデルの異なる部分を変更するかを決定するために、充填されている。
あなたが
、ちょうど言うのではなく、単に問題が発生している部分を変更したい場合など、それ故にvisualgcの、埋められたメモリの一部を決定することは困難ですファイン!私はJVMにRAMの1Gが得られます。
あなたはおそらくそれのためのより良いプログラムを見つける長期的に、あなたは何をしているかについてより正確にしてみます。
、メモリリークは、あなたがして後、試験前のメモリだったかテストすることによって、そのためのユニットテストを使用することができるかもしれ場所を決定するには、あまりにも大きなAの変更がある場合、あなたはそれを調べたいかもしれませんが、あなたのテストがまだ実行されている間、チェックを行う必要があります。
;例えばます。
-Xmx256M
あなたがprograme以下を通して、あなたのヒープメモリサイズを取得することができます。
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する
- 私の知る限り、ヒープ領域はインスタンス変数のみによって占められています。これが正しい場合、オブジェクトの作成時にインスタンス変数のスペースが割り当てられるため、しばらく正常に実行された後にこのエラーが発生した理由がわかります。
これは、一定期間にわたって継続的にアプリケーション内でより多くのオブジェクトを作成していることを意味します。新しいオブジェクトはヒープ メモリに格納されるため、ヒープ メモリが増加します。
ヒープにはインスタンス変数だけが含まれるわけではありません。すべての非プリミティブ データ型 (オブジェクト) が保存されます。これらのオブジェクトの存続期間は、短い (メソッド ブロック) 場合もあれば、長い (オブジェクトがアプリケーションで参照されるまで) 場合もあります。
- ヒープ領域を増やす方法はありますか?
はい。このオラクルを見てください 記事 詳細については。
ヒープ サイズを設定するには 2 つのパラメータがあります。
-Xms:, 、初期および最小ヒープ サイズを設定します。
-XMX:, 、最大ヒープ サイズを設定します
- 取得するヒープ領域を少なくするには、プログラムにどのような変更を加える必要がありますか?
それはアプリケーションによって異なります。
アプリケーションの要件に応じて最大ヒープ メモリを設定します。
アプリケーションでメモリリークを引き起こさないようにする
アプリケーションでメモリ リークを見つけた場合は、次のようなプロファイリング ツールを使用して根本原因を見つけます。 マット, ビジュアルVM , jコンソール 等根本原因が見つかったら、漏れを修正します。
オラクルからの重要な注意事項 記事
原因:詳細メッセージ Java ヒープ スペースは、オブジェクトを Java ヒープに割り当てることができなかったことを示しています。このエラーは、必ずしもメモリ リークを意味するものではありません。
考えられる理由:
- 不適切な構成 (十分なメモリが割り当てられていない)
- アプリケーションが意図せずオブジェクトへの参照を保持しているため、オブジェクトがガベージ コレクションされなくなります。
- ファイナライザーを過度に使用するアプリケーション。クラスにファイナライズ メソッドがある場合、その型のオブジェクトはガベージ コレクション時に領域が再利用されません。 ファイナライザー スレッドがファイナライズ キューに追いつかない場合、Java ヒープがいっぱいになり、このタイプの OutOfMemoryError 例外がスローされる可能性があります。.
話は変わりますが、より優れたガベージ コレクション アルゴリズムを使用してください ( CMS または G1GC)
これを見てください 質問 G1GCを理解するために
ほとんどの場合、コードは最適化されていません。今後は必要ないと思われるオブジェクトを解放します。ループ内で毎回オブジェクトを作成することは避けてください。キャッシュを使用してみてください。あなたのアプリケーションがどうなっているのかわかりません。しかし、プログラミングでは、通常の生活における 1 つのルールも同様に当てはまります。
治療よりも予防が大切です。「不要なオブジェクトを作成しないでください」
ローカル変数はスタック上にあります。ヒープ領域はオブジェクトによって占有されます。
使用できます
-Xmx
オプション。基本的にヒープ領域は、新しいオブジェクトを割り当てるたびに使い果たされます。
new
オブジェクトが参照されなくなった後、しばらくして解放されます。したがって、不要になったオブジェクトへの参照を保持しないようにしてください。
いいえ、私はあなたがスタック領域のことを考えていると思います。ヒープスペースは、オブジェクトによって占有されています。それを向上させる方法を使用すると、コマンドラインに必要な量で256を置き換え、-Xmx256mです。
NetBeansで、ゴー 'RUN' にツールバー、 - > 'の設定プロジェクトの設定' - > 'カスタマイズ' - >そのポップアップwindoの 'RUN' - > 'VMオプション' - >塗りつぶしで'-Xms2048m -Xmx2048m'。これは、ヒープサイズの問題を解決することができます。
あなたはJUnitのと春は、すべてのテストクラスでこれを追加してみてください使用している場合は、その例外を回避するには:
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)