我創建一個新的主持人,像這樣:GWT垃圾收集
new MyPresenter(new MyView());
它註冊了一些事件處理程序和綁定到視圖和這樣。最終,我可能會「關閉」該視圖,以便它不再由瀏覽器呈現。我並沒有在任何地方保留對這個MyPresenter
這個實例的引用。
在關於此主題的Google論壇中,常規回答是「將您的引用設置爲null」,然後不必擔心。與JavaScript不同,我不能只用Java中的this = null;
來說明原因。但在Javascript中,很容易清空我知道不再使用的對象引用。
我的問題:我怎麼知道這個主持人是否被垃圾收集,因爲我沒有保留對它的引用?它非常清楚地存在。我應該相信GWT和JS會照顧這個嗎?或者我需要維護自己對MyPresenter
的引用,以便我可以在完成後手動執行null
?
這取決於瀏覽器。基本上,如果你沒有對象的引用,它將被收集,但有bug,像IE中的着名的錯誤,DOM和JS對象之間的交叉引用(GWT中的默認組件通常被保護),或一些垃圾收集器無法刪除對象島。由於有很多瀏覽器,所以沒有通用的技巧或工具來解決這個問題。唯一的選擇是運行性能測試,並檢查內存使用情況。 – jusio 2012-04-23 15:51:19
我不**曾經從我的(用戶)代碼中引用該對象,但它可以存在,因爲它可以處理事件,如果我將它們解僱。但是,如果我刪除這些事件處理程序並將'MyView'清空足以導致GC'd?我的恐懼是,事實並非如此。 – 2012-04-23 16:04:44
@TravisWebb它*應該*足夠。但是意外發生了。我無法評論所有與GC有關的bug,但它們發生在時間之後。如果你刪除了對象的所有引用,它應該被收集(添加一些東西作爲事件監聽器,算作創建引用,因爲某個對象某處必須知道在哪裏發送事件) – jusio 2012-04-23 16:22:56