關於Jquery記憶體的釋放

來源:互聯網
上載者:User

項目進入尾聲,又是最恐怖的效能測試 (對著JS的效能測試我只能做這個表情 -_-!   )
經過多次的代碼檢查和測試,確認已經把自己定的變數什麼的一大堆都已經用null處理,並且沒有明顯的循環參考,但結果進行使用者某一動作時,記憶體還是沒被全部回收,而是線性增加,最後發現,問題都是出現在DOM身上
主要是太相信JQuery的empty()和 remove(),以為他們會把DOM都清理了,結果浪費了我兩天的時間 orz ..
但結果是empty()是調用remove()來進行清空的,而remove()則是先清理所有選中的對象及其子物件的所有事件和屬性,再使用removeChild()刪除自己,而問題就是出現在這裡
經在IE6下測試,removeChild()有兩個很重要特性:
第一,他不會刪除DOM中的事件
第二,他不會真正刪除(釋放)指定對象中的子物件
而JQuery就是犯了第二條, 結果所有子物件都成為了不在DOM樹中的“游離子DOM樹”,這時JS是無能為力了(因為已經沒有引用地址,例如變數名),即使使用CollectGarbage();都不能釋放記憶體
解決方案(虛擬碼):
jQuery( “*”, obj).add([obj]).each(function(){
jQuery.event.remove(this);
jQuery.removeData(this);
});
obj.innerHTML = “”;

上 面代碼意思是:使用JQuery把指定對象及所有子物件的事件和屬性去除,這是由於使用innerHTML和removeChild()一樣也不能清除對 象的事件,然後使用innerHTML=”” 來清空內容,使用innerHTML=”能把所有子物件都完全清空,問題解決

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.