JavaFX节点对象不是垃圾回收

Sta*_*tas 2 garbage-collection jvm memory-leaks javafx javafx-2

JavaFX(1.2.x和1.3.x)似乎不允许至少为节点和场景进行垃圾收集.从Scene中删除后,Node对象不会被释放(没有其他显式引用).

这是一个例子:

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]
   }
Run Code Online (Sandbox Code Playgroud)

buttonB永远不会被释放.将skin设置为null有助于某种方式(在VisualVM中,大多数对该按钮的引用都会消失),但不能解决问题.我也尝试使用JavaFX反射使所有成员无效而没有运气.

是否可以使buttonB符合GC的要求以及如何操作?

问题是否仍然存在于JavaFX 2.0中?

Thi*_*ler 6

我发现(通过visualVM检查)JavaFX 1.3将SoftReferences保存到已删除的节点的缓冲图像(可能代表节点的渲染版本).对我来说,这是一种内存泄漏,因为根据可用内存量清除了软引用.这不是内存泄漏(由于这个原因,OutOfMemoryException永远不会发生),但对我而言,这是导致垃圾收集非常低效的原因.

您可以使用它XX:SoftRefLRUPolicyMSPerMB=<N>来减少保留SoftReferences的时间,但这可能会(但不太可能)性能损失.它设置保留对象的每个可用MB的毫秒数.默认值为1000毫秒.