亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

JavaScript的內存釋放問題詳解

2024-05-06 16:15:03
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了JavaScript的內存釋放問題詳解的相關資料,需要的朋友可以參考下
 

本文詳細的講解了JavaScript及IE瀏覽器對內存的管理和釋放的時機和方法,希望對前端開發人員有所幫助。

一個內存釋放的實例

 

復制代碼代碼如下:

<SCRIPT LANGUAGE="JavaScript">
<!--
strTest = "1";
for ( var i = 0; i < 25; i ++ )
{
strTest += strTest;
}
alert(strTest);
delete strTest;
CollectGarbage();
//-->
</SCRIPT>

 

CollectGarbage,是IE的一個特有屬性,用于釋放內存的,使用方法嘛應該是,將該變量或引用對象,設置為null或delete,然后在進行釋放動作

在做CollectGarbage前,要必需清楚的兩個必備條件:

引用- 一個對象在其生存的上下文環境之外,即會失效。
- 一個全局的對象在沒有被執用(引用)的情況下,即會失效。

 

復制代碼代碼如下:

//---------------------------------------------------------
// JavaScript對象何時失效
//---------------------------------------------------------
function testObject() {
var _obj1 = new Object();
}
function testObject2() {
var _obj2 = new Object();
return _obj2;
}
// 示例1
testObject();
// 示例2
testObject2()
// 示例3
var obj3 = testObject2();
obj3 = null;
// 示例4
var obj4 = testObject2();
var arr = [obj4];
obj3 = null;
arr = [];

 

在這四個示例中:
- “示例1”在函數testObject()中構造了_obj1,但是在函數退出時,它就已經離開了函數的上下文環境,因此_obj1失效了;

- “示例2”中,testObject2()中也構造了一個對象_obj2并傳出,因此對象有了“函數外”的上下文環境(和生存周期),然而由于函數的返回值沒有被其它變量“持有”,因此_obj2也立即失效了;

- “示例3”中,testObject2()構造的_obj2被外部的變量obj3持用了,這時,直到“obj3=null”這行代碼生效時,_obj2才會因為引用關系消失而失效。

- 與示例3相同的原因,“示例4”中的_obj2會在“arr=[]”這行代碼之后才會失效。

但是,對象的“失效”并不等會“釋放”。在JavaScript運行環境的內部,沒有任何方式來確切地告訴用戶“對象什么時候會釋放”。這依賴于JavaScript的內存回收機制。——這種策略與.NET中的回收機制是類同的。

在前面的Excel操作示例代碼中,對象的所有者,也就是"EXCEL.EXE"這個進程只能在“ActiveX Object實例的釋放”之后才會發生。而文件的鎖,以及操作系統的權限憑證是與進程相關的。因此如果對象僅是“失效”而不是“釋放”,那么其它進程處理文件和引用操作系統的權限憑據時就會出問題。

——有些人說這是JavaScript或者COM機制的BUG。其實不是,這是OS、IE和JavaScript之間的一種復雜關系所導致的,而非獨立的問題。

Microsoft公開了解決這種問題的策略:主動調用內存回收過程。

在(微軟的)JScript中提供了一個CollectGarbage()過程(通常簡稱GC過程),GC過程用于清理當前IE中的“失效的對象失例”,也就是調用對象的析構過程。

在上例中調用GC過程的代碼是:

 

復制代碼代碼如下:

//---------------------------------------------------------
// 處理ActiveX Object時,GC過程的標準調用方式
//---------------------------------------------------------
function writeXLS() {
//(略...)
excel.Quit();
excel = null;
setTimeout(CollectGarbage, 1);
}

 

第一行代碼調用excel.Quit()方法來使得excel進程中止并退出,這時由于JavaScript環境執有excel對象實例,因此excel進程并不實際中止。

第二行代碼使excel為null,以清除對象引用,從而使對象“失效”。然而由于對象仍舊在函數上下文環境中,因此如果直接調用GC過程,對象仍然不會被清理。

第三行代碼使用setTimeout()來調用CollectGarbage函數,時間間隔設為'1',只是使得GC過程發生在writeXLS()函數執行完之后。這樣excel對象就滿足了“能被GC清理”的兩個條件:沒有引用和離開上下文環境。

GC過程的使用,在使用了ActiveX Object的JS環境中很有效。一些潛在的ActiveXObject包括XML、VML、OWC(Office Web Componet)、flash,甚至包括在JS中的VBArray。從這一點來看,ajax架構由于采用了XMLHTTP,并且同時要滿足“不切換頁面”的特性,因此在適當的時候主動調用GC過程,會得到更好的效率用UI體驗。

事實上,即使使用GC過程,前面提到的excel問題仍然不會被完全解決。因為IE還緩存了權限憑據。使頁的權限憑據被更新的唯一方法,只能是“切換到新的頁面”,

因此事實上在前面提到的那個SPS項目中,我采用的方法并不是GC,而是下面這一段代碼:

 

復制代碼代碼如下:

//---------------------------------------------------------
// 處理ActiveX Object時采用的頁面切換代碼
//---------------------------------------------------------
function writeXLS() {
//(略...)
excel.Quit();
excel = null;
// 下面代碼用于解決IE call Excel的一個BUG, MSDN中提供的方法:
// setTimeout(CollectGarbage, 1);
// 由于不能清除(或同步)網頁的受信任狀態, 所以將導致SaveAs()等方法在
// 下次調用時無效.
location.reload();
}

 

delete 運算符在手冊上的說明
引用從對象中刪除一個屬性,或從數組中刪除一個元素。

delete expression

expression 參數是一個有效的 JScript 表達式,通常是一個屬性名或數組元素。

說明

如果 expression 的結果是一個對象,且在 expression 中指定的屬性存在,而該對象又不允許它被刪除,則返回 false。

在所有其他情況下,返回 true。

最后之最后,關于GC的一個補充說明:在IE窗體被最小化時,IE將會主動調用一次CollectGarbage()函數。這使得IE窗口在最小化之后,內存占用會有明顯改善


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
wwwwwwww亚洲| 亚洲国产精品一区二区三区| 欧美小视频在线| 日韩的一区二区| 色七七影院综合| 亚洲精品成人久久久| 亚洲欧美另类在线观看| 欧美日韩国产激情| 欧美精品手机在线| 国产精品96久久久久久| 国产视频久久久久| 欧美日韩激情视频| 国产精品久久久久久av福利| 91av视频在线| 亚洲精品一区中文字幕乱码| 欧美丰满少妇xxxxx| 精品一区精品二区| 正在播放亚洲1区| 日韩欧美主播在线| 亚洲精品永久免费精品| 国产精品日韩在线播放| 国产精品福利观看| 久久夜色撩人精品| 97久久久免费福利网址| 国产精品尤物福利片在线观看| 欧美另类老女人| 久久久久女教师免费一区| 久久资源免费视频| 久久777国产线看观看精品| 国产精品69精品一区二区三区| 91精品久久久久久久久久久| 国产精品国产三级国产专播精品人| 成人444kkkk在线观看| 日韩精品一区二区三区第95| 国产精品久久电影观看| 国模私拍视频一区| 成人黄色网免费| 日韩视频永久免费观看| 国产精品成人免费视频| 欧美丝袜美女中出在线| 欧美性生活大片免费观看网址| 亚洲精品免费网站| 日韩美女写真福利在线观看| 成人免费网视频| 色偷偷av一区二区三区| 国产成人精品网站| 欧美成人午夜剧场免费观看| 在线成人激情视频| 青青久久aⅴ北条麻妃| 成人黄色激情网| 欧美成人自拍视频| 欧美日韩精品在线视频| 成人黄色免费网站在线观看| 国产午夜精品免费一区二区三区| 一区二区三区日韩在线| 91亚洲国产成人久久精品网站| 中文字幕久精品免费视频| 97视频在线观看免费高清完整版在线观看| 97在线免费观看| 欧美成年人视频网站欧美| 中国日韩欧美久久久久久久久| xxxx性欧美| 欧美黑人巨大精品一区二区| 欧美黄色片在线观看| 亚洲精品91美女久久久久久久| 久久久国产一区二区三区| 欧美电影在线播放| 中文字幕日本精品| 国产精品高潮呻吟久久av野狼| 日韩av在线直播| 成人www视频在线观看| 欧美精品videossex88| 久久久久久网址| 国产精品三级美女白浆呻吟| 亚洲人成伊人成综合网久久久| 欧美大片第1页| 精品国产欧美一区二区五十路| 456国产精品| 狠狠操狠狠色综合网| 精品日韩中文字幕| 欧美一级片免费在线| 九九热精品视频国产| 日韩欧亚中文在线| 欧美黄色三级网站| 黄色一区二区三区| 欧美性jizz18性欧美| 成人在线免费观看视视频| 亚洲精品日韩丝袜精品| 日韩国产在线看| 亚洲国产精品久久久久秋霞蜜臀| 国产亚洲视频中文字幕视频| 日韩av日韩在线观看| 亚洲精品第一国产综合精品| 成人黄色在线免费| 亚洲免费电影在线观看| 国产日产久久高清欧美一区| 欧美成人亚洲成人| 成人国内精品久久久久一区| 国产精品亚洲第一区| 亚洲国产精品电影| 国内精久久久久久久久久人| 欧美国产日本在线| 亚洲精品动漫100p| 久久精品成人欧美大片古装| 成人97在线观看视频| 欧美激情一区二区三级高清视频| 亚洲3p在线观看| 国产亚洲精品久久| 亚洲人成网站色ww在线| 一夜七次郎国产精品亚洲| 国产精品pans私拍| 国产精品一区二区3区| 精品一区二区三区四区在线| 精品中文字幕在线2019| 国产精品午夜国产小视频| 亚洲人精选亚洲人成在线| 国外日韩电影在线观看| 国产精品美女www爽爽爽视频| 久久99精品久久久久久琪琪| 国产最新精品视频| 国产精品自产拍高潮在线观看| 亚洲国模精品私拍| 亚洲人成在线观| 国产亚洲综合久久| 国产精品视频yy9099| 尤物精品国产第一福利三区| 日韩69视频在线观看| 国产午夜精品麻豆| 国产精品欧美日韩久久| 欧美猛少妇色xxxxx| 91久久精品国产91性色| 久久伊人精品天天| 国产成人精品久久二区二区| 97久久久久久| 热re91久久精品国99热蜜臀| 亚洲福利在线观看| 亚洲跨种族黑人xxx| 亚洲精品国产综合久久| 国产美女久久精品香蕉69| 欧美亚洲另类视频| 日韩在线激情视频| 97超碰蝌蚪网人人做人人爽| 亚洲bt欧美bt日本bt| 国产成人精品综合久久久| 欧美第一黄色网| 综合网日日天干夜夜久久| 国产亚洲xxx| 国产在线视频一区| 久久久精品一区二区三区| 亚洲人成网站在线播| 九九热在线精品视频| 久久久久久亚洲精品不卡| 国产精品直播网红| 国产精品扒开腿做爽爽爽的视频| 亚洲最大的网站| 国产欧美精品在线播放| 亚洲午夜av久久乱码| 国产精品久久av| 91av在线国产| 91精品国产91久久久久福利| 国产精品日韩在线播放| 日韩女优人人人人射在线视频| 欧美黑人性生活视频| 中文字幕欧美日韩在线|