<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    IE內存泄露與無法回收研究小結

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接 一、內存泄露 
       之前確實看了很多資料,但這位大哥的話可謂畫龍點睛,不是奉承他,一下子就打通了我的任督二脈,請看: 
    trarck 寫道
       IE下的內存泄露原因就是循環引用,IE的垃圾回收器不能很好處理這種引用。 
    會產生泄露的循環引用,只有孤立的DOM對象(脫離DOM樹)。 
    孤立的DOM對象間的循環引用,孤立的DOM對象與JS對象的循環引用 
    為什么是孤立的DOM對象呢?在離開頁面時(刷新,跳轉)會刪除整個DOM樹,在DOM樹上的對象也會被刪除,就算有循環引用,此時被打斷。 
    孤立的DOM對象有:一、用JS創建但未加入DOM樹。二、從DOM樹中刪除的。 
    所以避免泄露,就盡量不要讓這樣的DOM對象產生。 
    有時候這樣對象又不可避免,那就不要讓這樣對像產生循環引用。 
    最常見的循環引用是由閉包產生,其執行環境中的變量(包括參數)引用了DOM對象。 

       看完了這段話,只會戰戰兢兢模仿示例的我立即就自創了一個新的例子。 
    示例1: 
    Java代碼  收藏代碼
    1. <input type="button" value="leak" id="leak" onclick="location.reload();"/>  
    2.   
    3. <script type="text/javascript"><!--  
    4. (function(){  
    5.         var test=$('<div />')[0];  
    6.         test.onclick=function(){};  
    7.         var s=[];  
    8.         for(var i=0;i<10000;i++){  
    9.             s.push('aaaa');  
    10.         }  
    11.         test.expan=s.join('');   
    12.         //$('body').append(test);  
    13.         //孤立的DOM元素才會泄露  
    14. })();         
    15. //--></script>  

    特殊情況:iframe 
    測試工具為:sIEve-0.0.8 
    在iframe中刷新頁面,頁面中有很多泄露,每刷一次增加一倍;但最后刷新其父頁面時所有的泄露都消失了。 
    而將iframe提出來單獨測試(刷新),沒有泄露。 

    二、內存回收 
    1、清除全局引用。道理很簡單,只要全局引用存在瀏覽器不能釋放對應的對象,因為在引用的生命周期內,對象隨時可能被調用。 
    Html代碼  收藏代碼
    1. <input type="button" value="TO GC" onclick="toGC()" />  
    2. <script type="text/javascript"><!--  
    3. function toGC(){  
    4.     g.s=null;  
    5. }  
    6.   
    7. var g={};  
    8. g.s=[];  
    9. for ( var i=0;i<100;i++){  
    10.     g.s.push($('<div  />')[0]);  
    11. }  
    12. //--></script>  

    如果不點擊TO GC按鈕,所創建的div永遠都不會釋放,直至頁面unload。 
    2、各瀏覽器不同的內存釋放機制 
       一個正常(無泄漏)的頁面,當它unload(比如href指向about:blank)時,在不同的瀏覽器中內存釋放情況并不相同。做了測試,使用某著名電子商務網站作測試對象。 
       IE7:不會出現顯著釋放,即使等1個小時也一樣,內存依然很高;最小化窗口才會釋放到幾M的水準。 
       FireFox3:無論如何都不釋放,目前還沒找到方法(當然,關閉窗口除外)。 
       Chrome6:立即釋放。 
    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全