簡體   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