2

JavaFX (1.2.x および 1.3.x) では、少なくともノードとシーンのガベージ コレクションが許可されていないようです。ノード オブジェクトは、シーンから削除された後は解放されません (他に明示的な参照はありません)。

次に例を示します。

var buttonB:Button =
   Button {
       text: "i'm just hanging here"
   }

var buttonC:Button =
   Button {
       text: "hit me to leak memory"
       action: function() {
           buttonB.managed = false;
           delete buttonB from mainBox.content;
           buttonB.skin = null;
           buttonB = null;
           java.lang.System.gc();
       }
   }

def mainBox:HBox =
   HBox {
       hpos: HPos.CENTER
       nodeVPos: VPos.CENTER
       layoutInfo: LayoutInfo {
        width: 800 height: 600
       }
       content: [buttonC, buttonB]
   }

buttonB は決して解放されません。スキンを null に設定すると、(VisualVM ではほとんどのボタンへの参照が消えます) 何らかの形で役立ちますが、問題は解決しません。また、JavaFX リフレクションを使用してすべてのメンバーを無効にしようとしましたが、うまくいきませんでした。

buttonB を GC の対象にすることは可能ですか?その方法は?

JavaFX 2.0 でも問題は解決しませんか?

4

1 に答える 1

6

私は(visualVM検査を通じて)JavaFX 1.3が、削除されたノードのバッファリングされたイメージ(おそらくノードのレンダリングされたバージョンを表す)へのSoftReferencesを保持していることを発見しました。私にとって、これは一種のメモリリークでした。これは、空きメモリの量に応じてソフト参照がクリアされるためです。これはメモリリークではありませんが(これが原因でOutOfMemoryExceptionが発生することはありません)、私にとってこれが非常に非効率的なガベージコレクションを引き起こす理由でした。

XX:SoftRefLRUPolicyMSPerMB=<N>SoftReferencesが保持される時間を短縮するために使用できますが、これはパフォーマンスが低下する可能性がありますが、可能性は低いです。オブジェクトが保持される空きMBあたりのミリ秒数を設定します。デフォルトは1000ミリ秒です。

于 2011-11-16T15:27:24.247 に答える