JavaFX节点对象不是垃圾回收

时间:2011-10-18 15:21:11

标签: memory-leaks garbage-collection jvm 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]
   }

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

是否可以使buttonB符合GC条件以及如何操作?

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

1 个答案:

答案 0 :(得分:7)

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

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