0

とりわけSSLを使用するアプリケーションがあります。アプリケーションのポイントは、無限に実行されることです。今の問題は、時間の経過とともに次の画像が表示されるようです。

漏れている

最初に、ヒープ ダンプ (Eclipse のメモリ アナライザー ツールを使用) を 2 つのポイントで調べます。 ) 最初はすべて問題ありません。私のアプリにはファイナライザー キューにいくつかのオブジェクトがあり、これらは消えます。しかし、30 分後、明確な理由もなく、ガベージ コレクションが発生している間、ファイナライザー クラスへの参照は消えません。これらのサイズは増加し続けており、オブジェクトとキュー内の次のファイナライザーを指す 10 個の参照が繰り返し発生しています。したがって、実際には、同じものへの参照の繰り返しチェーンであり、収集されることはありません。これは最初に収集されましたが。

したがって、私の質問は実際には2つあります。最初の質問:これが突然収集されない原因は何ですか? (コードをかなり注意深く調べたので、ファイナライザクラスによって参照されているもの(入力ストリームと出力ストリーム、明らかに。また、使用しているSSLライブラリからのいくつかの抽象的なもの、私は一般的な Client.getConnectionManager().shutdown() を使用していますが、これは最初にそれをクリアする必要があると思います。なんらかの理由で参照キューが大きくなりすぎて、コレクターがそれを処理できないということを何度も繰り返していますか?

2 番目の質問: この問題を解決するにはどうすればよいですか? あなたが見ている画像はJconsoleからのもので、手動GCを実行すると、これらはすべて消えて最初からやり直します。

正しい方向への助けや微調整は大歓迎です。

4

3 に答える 3

1

フル GCが状況をクリアし、メモリ使用量の下限を最初の 10MB に戻した場合、これは、Edenスペース/ Survivor スペースが小さすぎるか、オブジェクトが古い世代に昇格するのが早すぎることを意味します (つまり、それらは収集されるだけです)。 Full GC が発生したとき)。

Eden spaceSurvivor spaceのサイズ変更から始めることをお勧めします。

などのフラグや、ガベージ コレクションを調整するその他のフラグについては、ガベージ コレクタの調整に関するドキュメントJava VM オプションを確認してください。XX:NewRatioXX:SurvivorRatio

XX:InitialTenuringThresholdまた、 andについてもお読みください。これら 2 つは、オブジェクトをOld 世代XX:MaxTenuringThresholdに入れるためのしきい値を定義します。これら 2 つを賢く使用すると、オブジェクトがSurvivor 空間に長くとどまり、 Full GCなしで収集されるようになります。

于 2013-09-06T10:29:54.717 に答える
0

必ずしもメモリリークであるとは限りません。この変動は、数か月にわたって継続的に実行されるプログラムに見られます。ガベージ コレクションが発生すると、通常のステージに戻ります。よくわかりませんが、プロファイラーを使用すると変動が激しくなることが時々あります。

于 2013-09-06T10:28:03.530 に答える