JavaFX addEventListener对Grand Parent的内存泄漏

时间:2013-11-11 07:03:26

标签: java memory-leaks garbage-collection javafx-2 javafx

为什么匿名内部类不会在这里发布,导致内存泄漏? 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();
        }
    }
});

2 个答案:

答案 0 :(得分:1)

内部类总是对其外部类保持强引用,并且如果外部类不再被引用则仅被引入。使它成为一个静态的内部类,你没有问题!

答案 1 :(得分:1)

第一个答案是错误的。确实,“一个内在的阶级总是对其外部阶级持有强烈的反对”,但事实却是如此。实际上,只要内在存在,就无法收集外层。

实例未被收集为注册为侦听器的原因。注册商通常对听众有强烈的引用,因此无法收集实例(不知道FX)。

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