1

匿名の内部クラスがここで解放されず、メモリ リークが発生するのはなぜですか? これは 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();
        }
    }
});
4

2 に答える 2

1

内部クラスは常にその外部クラスへの強力な参照を保持し、外部クラスが参照されなくなった場合にのみ gced されます。静的な内部クラスにすれば、問題はありません!

于 2013-11-11T07:37:13.283 に答える
1

最初の答えは間違っています。「内部クラスは常にその外部クラスへの強力な参照を保持している」というのは本当ですが、逆になります。実は、インナーが生きている限り、アウタークラスは回収できません。

インスタンスがリスナーとして登録されているために収集されない理由。レジストラは通常、リスナーへの強力な参照を保持しているため、インスタンスを収集できません (FX についてはわかりません)。

異なる動作の唯一の説明は、各オブジェクトが異なるコンポーネントに登録されたことです。そのうちの 1 つは収集され、もう 1 つは収集されていません。理由がわからないのですが、そのうちの 1 つがダイアログに属していたのではないでしょうか?

于 2013-11-11T10:32:31.420 に答える