いつものように、長い問題の説明です。
現在、製品のストレス テストを行っていますが、奇妙な問題に直面しています。1 ~ 2 時間後、ヒープ領域が拡大し始め、しばらくしてアプリケーションが停止します。
アプリケーションをプロファイリングすると、非常に大量の Finalizer オブジェクトが表示され、ヒープがいっぱいになります。さて、私たちは「奇妙なファイナライザー スレッドが遅くなる可能性がある」と考え、ファイナライズする必要があるオブジェクト (この場合は JNA ネイティブ ハンドル) の量を減らす方法を検討しました。とにかく良いアイデアで、何千もの新しいオブジェクトを減らしました...
次のテストでは同じパターンが示されましたが、わずか 1 時間後にはそれほど急勾配ではありませんでした。今回のファイナライザーは、テストベッドで頻繁に使用される FileInput ストリームと FileOutput ストリームに由来します。すべてのリソースは閉じられていますが、ファイナライザーはもうクリーンアップされていません。
1 時間または 2 時間後 (例外なし)、FinalizerThread が突然動作を停止したように見える理由がわかりません。一部のスレッドで手動で System.runFinalization() を強制すると、プロファイラーはファイナライザーがクリーンアップされたことを示します。テストをすぐに再開すると、ファイナライザーに新しいヒープが割り当てられます。
FinalizerThread はまだそこにあり、jConsole に待機中であることを尋ねています。
編集
まず、HeapAnalyzer を使用してヒープを調べたところ、新しいことや奇妙なことは何も明らかになりませんでした。HeapAnalyzer にはいくつかの優れた機能がありますが、最初は苦労しました。私は jProfiler を使用しています。これには優れたヒープ検査ツールが付属しており、そのまま使用できます。
たぶん、HeapAnalyzer のいくつかのキラー機能が欠けているのでしょうか?
次に、今日、プロファイラーの代わりにデバッグ接続を使用してテストをセットアップしました。システムは現在、5 時間近く安定しています。これは、あまりにも多くのファイナライザー (最初のレビューで削減されたもの)、プロファイラー、および VM GC 戦略の非常に奇妙な組み合わせのようです。現時点ではすべてが正常に動作しているため、実際の洞察はありません...
これまでの情報に感謝します - 引き続き注目して興味を持っていただければ幸いです (これで、単純なプログラミングの誤りについては話さないと信じる理由が増えたかもしれません)。