2012-04-23 261 views
6

我創建一個新的主持人,像這樣:GWT垃圾收集

new MyPresenter(new MyView()); 

它註冊了一些事件處理程序和綁定到視圖和這樣。最終,我可能會「關閉」該視圖,以便它不再由瀏覽器呈現。我並沒有在任何地方保留對這個MyPresenter這個實例的引用。

在關於此主題的Google論壇中,常規回答是「將您的引用設置爲null」,然後不必擔心。與JavaScript不同,我不能只用Java中的this = null;來說明原因。但在Javascript中,很容易清空我知道不再使用的對象引用。

我的問題:我怎麼知道這個主持人是否被垃圾收集,因爲我沒有保留對它的引用?它非常清楚地存在。我應該相信GWT和JS會照顧這個嗎?或者我需要維護自己對MyPresenter的引用,以便我可以在完成後手動執行null

+0

這取決於瀏覽器。基本上,如果你沒有對象的引用,它將被收集,但有bug,像IE中的着名的錯誤,DOM和JS對象之間的交叉引用(GWT中的默認組件通常被保護),或一些垃圾收集器無法刪除對象島。由於有很多瀏覽器,所以沒有通用的技巧或工具來解決這個問題。唯一的選擇是運行性能測試,並檢查內存使用情況。 – jusio 2012-04-23 15:51:19

+0

我不**曾經從我的(用戶)代碼中引用該對象,但它可以存在,因爲它可以處理事件,如果我將它們解僱。但是,如果我刪除這些事件處理程序並將'MyView'清空足以導致GC'd?我的恐懼是,事實並非如此。 – 2012-04-23 16:04:44

+0

@TravisWebb它*應該*足夠。但是意外發生了。我無法評論所有與GC有關的bug,但它們發生在時間之後。如果你刪除了對象的所有引用,它應該被收集(添加一些東西作爲事件監聽器,算作創建引用,因爲某個對象某處必須知道在哪裏發送事件) – jusio 2012-04-23 16:22:56

回答

2

有兩種類型的內存泄漏:

  • DOM /瀏覽器級別內存泄漏
  • 應用程序的內存泄漏。

在關閉應用程序後,DOM /瀏覽器級內存泄漏通常會持續。 AFAIK只有舊的瀏覽器(IE6)受到影響,這就是GWT使用special way附加處理程序的原因。
這對現代瀏覽器來說應該不是問題,至少在關閉應用程序時它們不會成爲問題。但它們可能會變成應用程序內存泄漏。 (有關更多詳細信息,請參見here)。但總的來說,現代的Javascript GC在釋放未使用的內存方面相當不錯。

應用程序內存泄漏可能是長時間運行的應用程序以及動態創建大量視圖/演示者並通過事件處理程序保持引用的問題。但這在很大程度上取決於相關方的範圍。
post是一個很好的參考資料,一些更多的信息。

最後爲了確保您確實沒有任何應用程序內存泄漏,您應該使用Dev Tools Heap Profiler來檢查較長時間的內存消耗。
blog post有一些更多的信息。