1

Why would the anonymous inner class not be released here, causing a memory leak? This happens for 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();
        }
    }
});

Why would this below on the other hand be garbage collected?

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

2 回答 2

1

一个内部类总是持有一个对其外部类的强引用,并且只有在外部类不再被引用时才会被 gced。让它成为一个静态内部类,你就没有问题了!

于 2013-11-11T07:37:13.283 回答
1

第一个答案是错误的。确实,“一个内部类总是对其外部类持有一个强引用”,但它反过来说。实际上,只要内部还活着,就无法收集外部类。

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

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

于 2013-11-11T10:32:31.420 回答