[英]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.