自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

關(guān)于IE的內(nèi)存泄漏與JavaScript內(nèi)存釋放

開(kāi)發(fā) 后端 前端
在打開(kāi)多個(gè)IE窗口時(shí),系統(tǒng)經(jīng)常會(huì)變慢,JavaScript運(yùn)行也會(huì)變慢。這是由于IE內(nèi)存泄漏所引起的。本文介紹如何通過(guò)JavaScript進(jìn)行內(nèi)存釋放,從而解決這個(gè)問(wèn)題。

最近做一個(gè)公司的業(yè)務(wù)系統(tǒng),公司要求能盡可能的與c/s近似,也就是如c/s一樣,點(diǎn)擊文本框可以彈出此項(xiàng)目的相關(guān)內(nèi)容,進(jìn)行選擇輸入。

我使用了彈出窗口,然后在子窗口雙擊選中項(xiàng)目,把選中的值返回給父窗體。在系統(tǒng)做完了之后,在客戶(hù)使用的過(guò)程,由于客戶(hù)使用的是512m的內(nèi)存配置,所以在打開(kāi)了30--40個(gè)窗體之后,ie的虛擬內(nèi)存占用量達(dá)到近200m,從而使系統(tǒng)變慢,javascript的運(yùn)行也變慢了。在google搜了一下之后,才知道可能是由于ie的內(nèi)存泄漏引起的。

使用任務(wù)管理器,打開(kāi)一個(gè)彈出窗口,ie內(nèi)存就增加1-3m,然后關(guān)閉窗口,有時(shí)內(nèi)存并不釋放,有時(shí)才釋放幾十k??磥?lái)問(wèn)題出在了內(nèi)存釋放上面。

接著按內(nèi)存釋放這個(gè)思路,進(jìn)行搜索查找方法,來(lái)進(jìn)行解決這個(gè)問(wèn)題。我找到一個(gè)javascript未公開(kāi)的函數(shù)CollectGarbage,這個(gè)函數(shù)是用來(lái)進(jìn)行內(nèi)存釋放的。我在所有的彈出窗口結(jié)束之前把所有的自己定義的javasctip的變量設(shè)置為null,并調(diào)用CollectGarbage函數(shù)。

javascript中把變量設(shè)為null,javascript并不會(huì)把內(nèi)存釋放,當(dāng)下次再次定義變量時(shí),就會(huì)覆蓋此變量所在的內(nèi)存。如果不設(shè)為null,javascript再次定義變量時(shí),會(huì)開(kāi)辟一個(gè)新的內(nèi)存空間。

在使用以上處理之后,再次打開(kāi)窗口,ie的內(nèi)存每次還是增加1-3m,但是在關(guān)閉窗口之后,則ie會(huì)釋放一定數(shù)量的內(nèi)存在500k至2m。起到了一定的作用。

由于我在頁(yè)面中使用了第三方的控件,第三方的控件中的javascript中的內(nèi)存是如何管理,就不是由我來(lái)控制的了。

1.javascript內(nèi)存釋放的方法示例

把所有上級(jí)函數(shù)的參數(shù)即使設(shè)為null,并使用CollectGarbage來(lái)釋放內(nèi)存。  

示例

  1. <script>     
  2.       
  3.   //32M     
  4.   function   AllocMem()     
  5.   {     
  6.   var   str="12345678";     
  7.   for(var   i=3;i<24;i++)     
  8.   str+=str;     
  9.   return   str;     
  10.   }     
  11.       
  12.   function   A(a)     
  13.   {     
  14.   a=null;     
  15.   return   r;     
  16.   function   r()     
  17.   {     
  18.   }     
  19.   }     
  20.       
  21.   var   f=A(AllocMem());     
  22.   alert(1);     
  23.   CollectGarbage();     
  24.   //明顯,已經(jīng)釋放了。     
  25.   r=null;     
  26.   alert(2);     
  27.   CollectGarbage();     
  28.       
  29.   </script>     

里面對(duì)于內(nèi)存釋放的規(guī)則(腳本層)已經(jīng)理解得很透了。  
  (每一層菜單分配?M的內(nèi)存.對(duì)著任務(wù)管理器才看到情況)  

注:
CollectGarbage()通常會(huì)在核心推出內(nèi)存,因就是IE或NS程序結(jié)束的時(shí)候才會(huì)調(diào)用.這樣才是安全的。

說(shuō)明:
1)   如果你在另一個(gè)window中keep了該window中的object的reference,即使關(guān)閉該window,內(nèi)存也沒(méi)有釋放   
   
2)更糟糕的是,如果你keep的是一個(gè)DOM   object的reference,   關(guān)閉該object   所在window,   IE會(huì)crash,   報(bào)內(nèi)存錯(cuò)誤(或者要求,重新啟動(dòng))  

【相關(guān)資訊】

  1. 不唐突的JavaScript的七條準(zhǔn)則
  2. JavaScript中的Object到底是什么
  3. 痛陳Javascript的缺點(diǎn)
  4. Javascript實(shí)現(xiàn)的超強(qiáng)語(yǔ)法高亮引擎
  5. JavaScript如何給JavaScript文件傳遞參數(shù)
責(zé)任編輯:王觀 來(lái)源: 動(dòng)態(tài)網(wǎng)站制作指南
相關(guān)推薦

2015-03-30 11:18:50

內(nèi)存管理Android

2024-03-11 08:22:40

Java內(nèi)存泄漏

2020-06-08 09:18:59

JavaScript開(kāi)發(fā)技術(shù)

2021-08-05 15:28:22

JS內(nèi)存泄漏

2022-05-26 09:51:50

JavaScrip內(nèi)存泄漏

2017-11-09 16:07:00

Web應(yīng)用內(nèi)存

2010-07-16 09:11:40

JavaScript內(nèi)存泄漏

2023-02-20 15:27:30

開(kāi)發(fā)JavaScript內(nèi)存管理

2019-01-30 18:24:14

Java內(nèi)存泄漏編程語(yǔ)言

2022-09-28 10:35:31

JavaScript代碼內(nèi)存泄漏

2023-12-18 10:45:23

內(nèi)存泄漏計(jì)算機(jī)服務(wù)器

2019-06-24 19:00:09

JavaScript內(nèi)存泄漏垃圾回收

2012-02-22 21:28:58

內(nèi)存泄漏

2013-06-04 14:21:20

Vector內(nèi)存釋放

2024-11-07 09:37:46

2009-06-16 11:17:49

內(nèi)存泄漏

2012-06-19 15:12:20

Java內(nèi)存泄露

2024-02-21 08:00:55

WindowsDWM進(jìn)程

2024-01-30 10:12:00

Java內(nèi)存泄漏

2021-08-09 09:54:37

內(nèi)存泄漏JS 阿里云
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)