还有人遇到过这种情况吗?这种情况发生在以下情况:
- 对象 A 包含文本字段(或文本区域)B。
- 我在 A 的构造函数中使用了 B.setOnKeyPressed,以便在 B 中按下某个键时执行操作。
- 之后,当 A 完成其功能并超出范围时,垃圾收集器将不会删除它。
如果 A 不包含 B,或者我没有使用 B.setOnKeyPressed,或者 B 从未获得焦点,则不会发生这种情况。当 A 类的大量对象需要使用然后被丢弃(只有它们不被丢弃!)时,这会导致内存泄漏。
有什么办法可以解决这个问题吗?
最佳答案
没有代码很难确定,但这似乎是正确的行为。
场景中有 TextField
B
。在 A
的构造函数中创建匿名类,我们将其命名为 A$onKeyPressed
。 Java 中的匿名类不是静态的,因此该类保留对 A
对象的引用。
构造函数完成后,您将获得链接
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 */ }
}
}
关于包含 textField 的 JavaFX 2 对象从未被垃圾收集器清除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9584581/