2013-04-01 31 views
2

如果通過var img=new Image()創建圖像,則會添加onload處理程序並設置img.src,將請求圖像數據,並調用onload,儘管圖像未附加到DOM樹。例如。未附加Image.onload垃圾回收

var img=new Image(); 
img.onload=function(){ 
    alert('Loaded!'); 
} 
img.src='test.png'; 

何時以及如何收集垃圾圖像? JavaScript能夠知道onload處理程序將被調用,並且僅調用一次,以便後來釋放圖像?如果img.src沒有設置,並且因此onload永遠不會被調用,並且img可以立即被釋放,JavaScript會通知嗎?

回答

2

我已經做了一些調查,使用test page找到問題的答案 - 當圖像對象具有事件處理程序,在JS中創建並且不附加到DOM樹時,被垃圾收集。

該頁面的JS代碼通過document.createElement("img")new Image()工作方式相同)創建1000個圖像,附加2個事件處理程序(加載和錯誤)並設置src屬性。
當加載所有圖像時,JS會嘗試釋放內存,在上次加載事件(=同步)中明確調用gc(),並立即將此圖像的src設置爲另一個URL。此外,計時器設置爲第二次釋放內存,因此稍後以異步方式完成。

Chrome Developer Tools中的內存時間表顯示第一個GC收集除最後一個之外的所有圖像。我將其解釋爲最後的圖像不能被GC化,因爲它正在加載新圖像。 發生第二個GC時,最後一個圖像已經加載並且也從內存中移除。

Memory Timeline


我從這個實驗結論:

  • 負載/錯誤事件處理程序被調用時,事件如果沒有鏈接到圖像 對象JS存在,
  • 圖像對象可以當圖像加載過程完成(成功或失敗)時被垃圾收集。

測試中的Chrome Canary 33.0.1733.2與--js-flags="--expose-gc"
的源代碼http://pastebin.com/YZkGYmBC

+0

這似乎是一個相當合理的行爲。希望其他瀏覽器能夠很好地處理這個問題。 – dronus