0

私はSpring Web MVCに取り組んでおり、最近java.lang.OutOfMemoryError: Java heap spaceに遭遇しました。

だから、私はそれについて読んでいましたが、私がしている大きな間違いは、使用されているオブジェクトを参照していないことです。そのため、GC は大量のメモリをクリーニングしていません。

問題は、いつそれを逆参照するかです。

基本的なアウト フローは次のとおりです。

From front end user sends a request

server calls a library with the users request

library returns it a big chunk of array of results.

server forwards it to front end. 

この時点まで、結果オブジェクトが必要なため、結果配列を逆参照できません。私は正しいですか?したがって、ユーザーが新しいリクエストを送信したときに、結果配列を消去して、新しいリクエストでライブラリを呼び出す必要があります。

また、-XX:+HeapDumpOnOutOfMemoryError を使用してダンプ ファイルを取得しました。しかし、プロジェクトフォルダーにダンプファイルが表示されません。ログを見ると、ダンプ ファイルが作成されていることがわかります。このケースに遭遇した人はいますか?

4

2 に答える 2

1

http://sscce.org/なしであなたを助けることは非常に難しいでしょう. JVM が GC を実行します。オブジェクトのスコープが明確に定義されている場合、オブジェクトは自動的に GC されるはずです。

これらを把握してヒープメモリを増やすことから始めることをお勧めします。

結果配列のスコープは何ですか (グローバルまたはメソッド呼び出し階層に制限されています。つまり、メソッド呼び出しスタックを介してフロントエンドに渡されます)?

グローバル スコープを持つ場合、それはシングルトン インスタンスの一部ですか、それともリクエスト インスタンスごとに作成されますか? Result 配列に格納されているオブジェクトは、コード内の他の場所で参照されていますか?

Jhat を使用してオブジェクト参照グラフを取得し、オブジェクトを参照している他のユーザーを見つけることができます (免責事項: 配列に格納されているオブジェクトに他のオブジェクトへの参照が含まれていると、面倒になります。通常はそうです)。

ガベージコレクションされていないオブジェクトを特定するより良い方法は?

于 2013-02-12T05:59:44.883 に答える