包含textField的JavaFX2对象从未被垃圾收集器清除

包含textField的JavaFX2对象从未被垃圾收集器清除,java,garbage-collection,javafx-2,Java,Garbage Collection,Javafx 2,还有其他人见过这个吗?这种情况发生在: 对象A包含textField(或textArea)B 我在A的构造函数中使用了B.setOnKeyPressed,当在B中按下一个键时,它会执行一些操作 之后,当A完成其功能并超出范围时,垃圾回收器不会将其删除 如果A不包含B,或者我没有使用B.setOnKeyPressed,或者B从未接收到焦点,则不会发生这种情况。当一个类的许多对象需要使用然后被丢弃时,这会导致内存泄漏(只有它们不会被丢弃!) 有没有办法解决这个问题?没有代码很难确定,但这似乎是正

还有其他人见过这个吗?这种情况发生在:

  • 对象A包含textField(或textArea)B
  • 我在A的构造函数中使用了B.setOnKeyPressed,当在B中按下一个键时,它会执行一些操作
  • 之后,当A完成其功能并超出范围时,垃圾回收器不会将其删除
如果A不包含B,或者我没有使用B.setOnKeyPressed,或者B从未接收到焦点,则不会发生这种情况。当一个类的许多对象需要使用然后被丢弃时,这会导致内存泄漏(只有它们不会被丢弃!)


有没有办法解决这个问题?

没有代码很难确定,但这似乎是正确的行为

现场有
TextField
B
。在
A
的构造函数中创建匿名类,我们将其命名为
A$onKeyPressed
。Java中的匿名类不是静态的,所以这个类保持对
对象的引用

在Constructor完成链接之后

scene -> B -> onKeyPressedListeners -> A$onKeyPressed -> A 
因此,A对GC无效

为了避免这种情况,可以创建命名的静态内部类,并在构造函数中使用。例如:

public class A {
    public A(TextField B) {
        B.setOnKeyPressed(new AHandler());
    }

    private static class AHandler implements EventHandler<KeyEvent> {
        public void handle(KeyEvent t) {  /* doStuff */ }
    }
}
公共A类{
公共A(文本字段B){
B.按下设置键(新的指针());
}
私有静态类AHandler实现EventHandler{
公共无效句柄(KeyEvent){/*doStuff*/}
}
}

我终于找到了解决这个问题的方法,做了两件事:

  • 在A超出范围时删除侦听器,方法是:B.setOnKeyPressed(null)
  • 通过C.getChildren()从其父节点C中删除B。删除(B)
    这允许垃圾收集器回收垃圾。但是,请注意(1)或(2)本身不起作用。两者都必须使用。

    谢尔盖,非常感谢你的回答。然而,这似乎并不能解决问题。即使使用静态处理程序,内存泄漏仍然存在。另外,(dostuff)还需要是静态的,这在我的应用程序中是不可取的。然而,我确实找到了一种解决方法,我将其作为一个单独的答案发布。