網頁教程:關於ie的記憶體流失與javascript記憶體釋放

來源:互聯網
上載者:User
javascript|教程|網頁

  最近做一個公司的業務系統,公司要求能儘可能的與c/s近似,也就是如c/s一樣,點擊文字框可以彈出此項目的相關內容,進行選擇輸入。

  我使用了快顯視窗,然後在子視窗雙擊選中項目,把選中的值返回給父表單。

  在系統做完了之後,在客戶使用的過程,由於客戶使用的是512m的記憶體配置,所以在開啟了30--40個表單之後,ie的虛擬記憶體佔用量達到近200m,從而使系統變慢,javascript的運行也變慢了。

  我使用工作管理員,開啟一個快顯視窗,ie記憶體就增加1-3m,然後關閉視窗,有時記憶體並不釋放,有時才釋放幾十k。看來問題出在了記憶體釋放上面。

  接著按記憶體釋放這個思路,進行搜尋尋找方法,來進行解決這個問題。我找到一個javascript未公開的函數CollectGarbage,這個函數是用來進行記憶體釋放的。我在所有的快顯視窗結束之前把所有的自己定義的javasctip的變數設定為null,並調用CollectGarbage函數。

  javascript中把變數設為null,javascript並不會把記憶體釋放,當下次再次定義變數時,就會覆蓋此變數所在的記憶體。如果不設為null,javascript再次定義變數時,會開闢一個新的記憶體空間。

  在使用以上處理之後,再次開啟視窗,ie的記憶體每次還是增加1-3m,但是在關閉視窗之後,則ie會釋放一定數量的記憶體在500k至2m。起到了一定的作用。
       由於我在頁面中使用了第三方的控制項,第三方的控制項中的javascript中的記憶體是如何管理,就不是由我來控制的了。
     
  1.javascript記憶體釋放的方法樣本

  把所有上級函數的參數即使設為null,並使用CollectGarbage來釋放記憶體。  

 樣本

  <script>    
  //32M  
  function   AllocMem()  
  {  
  var   str="12345678";  
  for(var   i=3;i<24;i++)  
  str+=str;  
  return   str;  
  }      
  function   A(a)  
  {  
  a=null;  
  return   r;  
  function   r()  
  {  
  }  
  }      
  var   f=A(AllocMem());  
  alert(1);  
  CollectGarbage();  
  //明顯,已經釋放了。  
  r=null;  
  alert(2);  
  CollectGarbage();     
  </script>  

  裡面對於記憶體釋放的規則(指令碼層)已經理解得很透了。  
  (每一層菜單分配?M的記憶體.對著工作管理員才看到情況)  

注:
CollectGarbage()通常會在核心推出記憶體,因就是IE或NS程式結束的時候才會調用.這樣才是安全的  

說明:
1)   如果你在另一個window中keep了該window中的object的reference,即使關閉該window,記憶體也沒有釋放  
  As   you   might   know,   windows   opened   with   window.open()   may   share   a   process   with   its   opener   (_blank   or   _new     window   may   not).   That   is,   even   if   you   see   those   two   windows   on   the   desktop,   if   you   look   at   the   process   table   in   the   Task   Manager,   you   may   only   see   one   IEXPLORE.EXE   running.   Memory   may   only   be   released   when   the   process   is   terminated  
   
2)更糟糕的是,如果你keep的是一個DOM   object的reference,   關閉該object   所在window,   IE會crash,   報記憶體錯誤(或者要求,重新啟動)  
   
  I   would   say   this   looks   like   a   bug,   you   might   want   to   report   to   Microsoft



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.