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

首頁 > 編程 > JavaScript > 正文

JavaScript的內存釋放問題詳解

2019-11-20 13:20:29
字體:
來源:轉載
供稿:網友

本文詳細的講解了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
久久视频在线观看免费| 色777狠狠综合秋免鲁丝| 国产91久久婷婷一区二区| 欧美性xxxxx极品娇小| 国产日韩在线播放| 色yeye香蕉凹凸一区二区av| 欧美日韩国产限制| 日本精品久久电影| 91av免费观看91av精品在线| 欧美日韩国产一区在线| 国产精品大片wwwwww| 亚洲最新在线视频| 亚洲国语精品自产拍在线观看| 欧美色播在线播放| 2019日本中文字幕| 7777精品久久久久久| 精品久久久久久久久久久久久久| 欧美激情视频网站| 国产精品日日做人人爱| 国产精品偷伦一区二区| 亚洲一区二区日本| 亚洲视频电影图片偷拍一区| 亚洲春色另类小说| 欧美性猛交xxx| 亚洲国产精品成人va在线观看| 91高潮精品免费porn| 一个色综合导航| 粉嫩老牛aⅴ一区二区三区| www.日韩av.com| 亚洲福利小视频| 欧美电影免费看| 黑人巨大精品欧美一区二区一视频| 欧美成人四级hd版| 欧美亚洲另类激情另类| 久久电影一区二区| 91久久精品国产91久久性色| 国产亚洲福利一区| 久久综合久中文字幕青草| 清纯唯美亚洲激情| 亚洲免费精彩视频| 日韩视频免费大全中文字幕| 欧美精品videos性欧美| 国产欧美一区二区三区久久人妖| 黄网站色欧美视频| 亚洲一区二区三| 久久久久久午夜| 亚洲精品资源美女情侣酒店| 亚洲电影免费观看高清完整版在线观看| 日韩三级影视基地| 久久久久www| 91牛牛免费视频| 成人午夜黄色影院| 国产精品国产亚洲伊人久久| 国产成人精品综合| 91wwwcom在线观看| 亚洲欧美在线一区| 亚洲天堂男人的天堂| 色悠久久久久综合先锋影音下载| 国产欧美中文字幕| xxxx欧美18另类的高清| 91爱爱小视频k| 日韩有码在线视频| 欧美视频一二三| 在线播放精品一区二区三区| 尤物九九久久国产精品的特点| 欧美日韩中文字幕在线视频| 久久久国产视频| 国产精品久久久久久五月尺| 久久精品国产v日韩v亚洲| 亚洲自拍偷拍福利| 91欧美视频网站| 久久久av免费| 91国产在线精品| 欧美在线免费看| 91在线观看免费高清| 中文字幕一区二区三区电影| 亚洲第一区在线| 精品亚洲永久免费精品| 国产国语刺激对白av不卡| 国产日韩在线看| 色婷婷成人综合| 狠狠躁夜夜躁人人爽天天天天97| 日韩精品免费在线播放| 曰本色欧美视频在线| 亚洲欧洲一区二区三区在线观看| 国产一区二区香蕉| 国产婷婷97碰碰久久人人蜜臀| 国产女同一区二区| 欧美日韩成人在线播放| 色午夜这里只有精品| 91在线视频一区| 久久五月天综合| 欧美性生活大片免费观看网址| 日韩美女视频中文字幕| 久久精品国产69国产精品亚洲| 久久综合亚洲社区| 欧美色视频日本高清在线观看| 亚洲片av在线| 麻豆国产精品va在线观看不卡| 国产福利精品av综合导导航| 国产成人综合精品| 欧美国产日本高清在线| 亚洲美女www午夜| 亚洲激情视频网站| 欧美激情va永久在线播放| 国产精品自产拍高潮在线观看| 最近2019免费中文字幕视频三| 日韩电影免费观看中文字幕| 欧美日韩在线另类| 欧美激情视频网站| 视频直播国产精品| 亚洲国产成人精品久久久国产成人一区| 成人写真福利网| 久久精品视频中文字幕| 日韩经典第一页| 蜜臀久久99精品久久久久久宅男| 日韩视频在线观看免费| 色播久久人人爽人人爽人人片视av| 国产丝袜一区二区三区| 欧美亚洲成人xxx| 国内精品视频久久| 欧美激情网站在线观看| 国产精品成人观看视频国产奇米| 国产精品视频自在线| 欧美香蕉大胸在线视频观看| 久久精品亚洲一区| 91视频九色网站| 色播久久人人爽人人爽人人片视av| 久久免费精品日本久久中文字幕| 色爱精品视频一区| 欧美人交a欧美精品| 九九热99久久久国产盗摄| 国产精品久久久久久亚洲调教| 亚洲成人av片在线观看| 欧美三级欧美成人高清www| 日韩欧美一区二区三区久久| 久久色免费在线视频| 成人av番号网| 久久综合久久88| 日本欧美中文字幕| 91av视频在线免费观看| 1769国内精品视频在线播放| 国产999精品久久久影片官网| 欧美疯狂xxxx大交乱88av| 欧美大片网站在线观看| 国产91色在线播放| 国产亚洲欧美aaaa| 性色av一区二区三区在线观看| 欧美做受高潮1| 国内精品模特av私拍在线观看| 久久精品夜夜夜夜夜久久| 日韩av手机在线看| 欧美xxxx18国产| 91老司机精品视频| 欧美猛交ⅹxxx乱大交视频| 亚洲一区二区三区sesese| 亚洲精品国精品久久99热| 欧美人在线视频| 91亚洲人电影| 亚洲国产日韩欧美综合久久| 国产日韩精品视频| 97国产一区二区精品久久呦| 成人av在线天堂| 亚洲午夜精品视频|