Javafxノードオブジェクトは、ゴミ収集ではありません
-
26-10-2019 - |
質問
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 Reflectionを使用してすべてのメンバーを無効にして無効にしようとしました。
buttonBをGCの資格を得ることができますか?それを行う方法はありますか?
問題はJavafx 2.0で持続しますか?
解決
(VisualVM検査を通じて)Javafx 1.3が保持することを発見しました ソフトレーフェンス 削除されたノードのバッファリングされた画像(おそらくノードのレンダリングされたバージョンを表す)に。私にとっては、自由メモリの量に応じてソフト参照がクリアされるため、これは一種のメモリリークでした。これはメモリリークではありません(これにより、OutOfMemoryExceptionは決して起こりません)が、私にとってこれは非常に非効率的なゴミ収集を引き起こす理由でした。
使用できます XX:SoftRefLRUPolicyMSPerMB=<N>
ソフトラファレンスが維持される時間を短縮するために、これは可能性のある(しかしありそうもない)パフォーマンスペナルティです。オブジェクトが保持される無料のMBあたりのミリ秒数を設定します。デフォルトは1000ミリ秒です。
所属していません StackOverflow