2

JavaFX(1.2.x 和 1.3.x)似乎至少不允许对节点和场景进行垃圾收集。Node 对象在从 Scene 中移除后不会被释放(没有其他明确的引用)。

这里是例子:

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 中的问题是否仍然存在?

4

1 回答 1

6

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

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

于 2011-11-16T15:27:24.247 回答