jvisualvm
アプリケーションのメモリリークをチェックするために使用しています。ヒープダンプを実行すると、ガベージコレクションされているはずのいくつかのオブジェクトが開いたままになっていることがあります。
それらに対して「ShowNearestGCRoot」コマンドを実行すると、ルートが、Runnableインターフェイスを実装する定義済みのクラスであることが示されます。参照はとしてリストされていますが(java frame)
、これはスレッド化と関係があることを私は知っています。このノードのツリーを展開すると、ツリーが開いて表示されます<no references>
。したがって、これは私が開いたままにしている参照ではなく、Javaの内部にあるものであることは明らかです。
jvisualvmにリストされているGCRootオブジェクトは、タイプAnalyticNode extends Node
がですNode implements Runnable
。このルートオブジェクトは、「フレーム」という言葉が使用されているにもかかわらず、AWT、Swing、またはヘビーウェイトのユーザーインターフェイスコンポーネントとはまったく関係がありません。この場合、「フレーム」という言葉はスレッディングを指します。
では、Javaは、これを開いたままにする最後のRunnableへの参照をどこかに保持しますか?ヒープダンプのために適切にガベージコレクションできるように、この参照を解放するようにJavaに指示する方法はありますか?
何が起きてる?