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

标签 java garbage-collection javafx-2

还有人遇到过这种情况吗?这种情况发生在以下情况:

  • 对象 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/

相关文章:

java - 如何为Java的GC日志指定时区?

hadoop - 如何为 Apache Hadoop NameNode 启用 GC 日志记录,同时防止日志文件覆盖和限制磁盘空间使用

java - 只允许在表格 View 上选择一个复选框

java - 有没有一种简单的方法可以在启动时在露天创建用户/组?

java - 如何使用 Freemarker 变量解析 String HTML

java - 使用 Java8 捕获 traceroute 中的组的正则表达式

java - 在免费/专业组合中正确扩展 AppWidgetProvider 和 IntentService

java - RMI 注册表生命周期、GC 等

java - 混音 Swing/FX : can't dispose a dialog from fxml controller

java - 如何更新 JavaFX LineChart 数据