- 私の知る限り、ヒープスペースはインスタンス変数のみで占められています。これが正しければ、オブジェクトの作成時にインスタンス変数のスペースが割り当てられるため、しばらくの間正常に実行された後にこのエラーが発生した理由。
つまり、一定期間にわたって継続的にアプリケーションでより多くのオブジェクトを作成しているということです。新しいオブジェクトはヒープメモリに格納され、それがヒープメモリの増加の理由です。
ヒープにはインスタンス変数が含まれているだけではありません。すべての非プリミティブデータ型(オブジェクト)を格納します。これらのオブジェクトの有効期間は、短い(メソッドブロック)または長い(アプリケーションでオブジェクトが参照されるまで)場合があります。
- ヒープスペースを増やす方法はありますか?
はい。詳細については、このオラクルの記事をご覧ください。
ヒープサイズを設定するには、次の2つのパラメータがあります。
-Xms:、初期および最小ヒープサイズを設定します
-Xmx:、最大ヒープサイズを設定します
- ヒープスペースを少なくするために、プログラムにどのような変更を加える必要がありますか?
アプリケーションによって異なります。
アプリケーションの要件に従って最大ヒープメモリを設定します
アプリケーションでメモリリークを引き起こさないでください
アプリケーションでメモリリークを見つけた場合は、MAT、Visual VM、jconsoleなどのプロファイリングツールを使用して根本原因を見つけます。根本原因を見つけたら、リークを修正します。
オラクルの記事からの重要な注意
原因:詳細メッセージ「Javaヒープ・スペース」は、オブジェクトをJavaヒープに割り当てることができなかったことを示しています。このエラーは、必ずしもメモリリークを意味するわけではありません。
考えられる理由:
- 不適切な構成(十分なメモリが割り当てられていない)
- アプリケーションが意図せずにオブジェクトへの参照を保持しているため、オブジェクトがガベージコレクションされるのを防ぎます
- ファイナライザーを過度に使用するアプリケーション。クラスにfinalizeメソッドがある場合、そのタイプのオブジェクトは、ガベージコレクション時にスペースが再利用されません。ファイナライザスレッドがファイナライズキューに追いつかない場合、Javaヒープがいっぱいになり、このタイプのOutOfMemoryError例外がスローされます。
別の注意点として、より優れたガベージコレクションアルゴリズム(CMSまたはG1GC)を使用してください
G1GCを理解するためにこの質問を見てください