繁体   English   中英

JavaFX addEventListener在父级上发生内存泄漏

[英]JavaFX addEventListener Memory Leak on Grand Parent

为什么不在这里释放匿名内部类,从而导致内存泄漏? 对于FX 2.2.1,会发生这种情况。

anchorPane.getParent().getParent().lookup("#grandParentButton").addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
    @Override
    public void handle(KeyEvent e) {
        if (e.getCode() == KeyCode.ENTER) {
            someButtonInsideAnchorPane.requestFocus();
            e.consume();
        }
    }
});

另一方面,为什么下面要进行垃圾收集呢?

button1InsideAnchorPane.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
    @Override
    public void handle(KeyEvent e) {
        if (e.getCode() == KeyCode.ENTER) {
            button2InsideAnchorPane.requestFocus();
            e.consume();
        }
    }
});

内部类始终对其外部类具有强引用,并且仅当不再引用外部类时才给予内部引用。 使其成为静态内部类,就没有问题了!

第一个答案是错误的。 的确,“一个内部类总是对其外部类拥有强大的引用”,但随后却相反。 实际上,只要内部类还活着,就无法收集外部类。

实例未注册为侦听器而未收集该实例的原因。 注册服务商通常对侦听器有很强的引用,因此无法收集实例(不了解FX)。

对于不同行为的唯一解释是,每个对象都向不同的组件注册。 其中一个已经收集,而另一个则没有。 不知道为什么,也许其中一个属于对话?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM