包含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完成其功能并超出范围时,垃圾回收器不会将其删除
有没有办法解决这个问题?没有代码很难确定,但这似乎是正确的行为 现场有
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)还需要是静态的,这在我的应用程序中是不可取的。然而,我确实找到了一种解决方法,我将其作为一个单独的答案发布。