中文字幕二区_国产精品免费在线观看_黄色网站观看_人人草人人澡_日本真实娇小xxxx

您的位置: 首頁(yè) > 技術(shù)文檔 > 網(wǎng)頁(yè)制作 > 關(guān)于Javascript的內(nèi)存泄漏問(wèn)題
background-clip/origin一則運(yùn)用 回到列表 標(biāo)記語(yǔ)言——標(biāo)題
 關(guān)于Javascript的內(nèi)存泄漏問(wèn)題

作者:yaohaixiao 時(shí)間: 2008-04-14 文檔類型:原創(chuàng) 來(lái)自:藍(lán)色理想

第 1 頁(yè) 關(guān)于Javascript的內(nèi)存泄漏問(wèn)題 [1]
第 2 頁(yè) 關(guān)于Javascript的內(nèi)存泄漏問(wèn)題 [2]
第 3 頁(yè) 關(guān)于Javascript的內(nèi)存泄漏問(wèn)題 [3]
第 4 頁(yè) 關(guān)于Javascript的內(nèi)存泄漏問(wèn)題 [4]

常規(guī)循環(huán)引用內(nèi)存泄漏和Closure內(nèi)存泄漏

要了解javascript的內(nèi)存泄漏問(wèn)題,首先要了解的就是javascript的GC原理。

我記得原來(lái)在犀牛書(shū)《JavaScript: The Definitive Guide》中看到過(guò),IE使用的GC算法是計(jì)數(shù)器,因此只碰到循環(huán) 引用就會(huì)造成memory leakage。后來(lái)一直覺(jué)得和觀察到的現(xiàn)象很不一致,直到看到Eric的文章,才明白犀牛書(shū)的說(shuō)法沒(méi)有說(shuō)得很明確,估計(jì)該書(shū)成文后IE升級(jí)過(guò)算法吧。在IE 6中,對(duì)于javascript object內(nèi)部,jscript使用的是mark-and-sweep算法,而對(duì)于javascript object與外部object(包括native object和vbscript object等等)的引用時(shí),IE 6使用的才是計(jì)數(shù)器的算法。

Eric Lippert在http://blogs.msdn.com/ericlippert/archive/2003/09/17/53038.aspx一文中提到IE 6中JScript的GC算法使用的是nongeneration mark-and-sweep。對(duì)于javascript對(duì)算法的實(shí)現(xiàn)缺陷,文章如是說(shuō):

"The benefits of this approach are numerous, but the principle benefit is that circular references are not leaked unless the circular reference involves an object not owned by JScript. "

也就是說(shuō),IE 6對(duì)于純粹的Script Objects間的Circular References是可以正確處理的,可惜它處理不了的是JScript與Native Object(例如Dom、ActiveX Object)之間的Circular References。

所以,當(dāng)我們出現(xiàn)Native對(duì)象(例如Dom、ActiveX Object)與Javascript對(duì)象間的循環(huán)引用時(shí),內(nèi)存泄露的問(wèn)題就出現(xiàn)了。當(dāng)然,這個(gè)bug在IE 7中已經(jīng)被修復(fù)了[http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html]。

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/IETechCol/dnwebgen/ie_leak_patterns.asp 中有個(gè)示意圖和簡(jiǎn)單的例子體現(xiàn)了這個(gè)問(wèn)題:

<html>
<head>
<script language = " JScript ">
var myGlobalObject;
function  SetupLeak()  // 產(chǎn)生循環(huán)引用,因此會(huì)造成內(nèi)存泄露
{
    //  First set up the script scope to element reference
    myGlobalObject  = document.getElementById("LeakedDiv");
    //  Next set up the element to script scope reference
    document.getElementById(" LeakedDiv ").expandoProperty  = myGlobalObject;
}
function  BreakLeak()  // 解開(kāi)循環(huán)引用,解決內(nèi)存泄露問(wèn)題
{
    document.getElementById( " LeakedDiv " ).expandoProperty  = null ;
}
</script>
</head>
<body onload = "SetupLeak()"  onunload = "BreakLeak()">
<div id = "LeakedDiv" ></div>
</body>
</html>
   

上面這個(gè)例子,看似很簡(jiǎn)單就能夠解決內(nèi)存泄露的問(wèn)題?上У氖,當(dāng)我們的代碼中的結(jié)構(gòu)復(fù)雜了以后,造成循環(huán)引用的原因開(kāi)始變得多樣,我們就沒(méi)法那么容易觀察到了,這時(shí)候,我們必須對(duì)代碼進(jìn)行仔細(xì)的檢查。

尤其是當(dāng)碰到Closure,當(dāng)我們往Native對(duì)象(例如Dom對(duì)象、ActiveX Object)上綁定事件響應(yīng)代碼時(shí),一個(gè)不小心,我們就會(huì)制造出Closure Memory Leak。其關(guān)鍵原因,其實(shí)和前者是一樣的,也是一個(gè)跨javascript object和native object的循環(huán)引用。只是代碼更為隱蔽,這個(gè)隱蔽性,是由于javascript的語(yǔ)言特性造成的。但在使用類似內(nèi)嵌函數(shù)的時(shí)候,內(nèi)嵌的函數(shù)有擁有一個(gè)reference指向外部函數(shù)的scope,包括外部函數(shù)的參數(shù),因此也就很容易造成一個(gè)很隱蔽的循環(huán)引用,例如:

DOM_Node.onevent ->function_object.[ [ scope ] ] ->scope_chain ->Activation_object.nodeRef ->DOM_Node。

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/IETechCol/dnwebgen/ie_leak_patterns.asp]有個(gè)例子極深刻地顯示了該隱蔽性:

<html>
<head>
<script language = "JScript">
function  AttachEvents(element)
{
    //  This structure causes element to ref ClickEventHandler
    //  element有個(gè)引用指向函數(shù)ClickEventHandler()
    element.attachEvent("onclick", ClickEventHandler);
    function  ClickEventHandler(){
                 //  This closure refs element
                 //  該函數(shù)有個(gè)引用指向AttachEvents(element)調(diào)用Scope,也就是執(zhí)行了參數(shù)element。
    }
}
function  SetupLeak()
{
    //  The leak happens all at once
    AttachEvents(document.getElementById("LeakedDiv"));
}
</script>
</head>
<body onload = "SetupLeak()"  onunload = "BreakLeak()">
<div id = "LeakedDiv"></div>
</body>
</html>

出處:藍(lán)色理想
責(zé)任編輯:bluehearts

上一頁(yè) 下一頁(yè) 關(guān)于Javascript的內(nèi)存泄漏問(wèn)題 [2]

◎進(jìn)入論壇網(wǎng)頁(yè)制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評(píng)論。

相關(guān)文章 更多相關(guān)鏈接
比較文檔位置
理解JavaScript中的事件
Javascript風(fēng)格要素 Ⅱ
Javascript風(fēng)格要素 Ⅰ
Javascript的一種模塊模式
作者文章
Ajax標(biāo)簽導(dǎo)航實(shí)例詳解
XMLHTTPRequest的屬性和方法簡(jiǎn)介
Ajax標(biāo)簽導(dǎo)航效果
關(guān)鍵字搜索 常規(guī)搜索 推薦文檔
熱門(mén)搜索:CSS Fireworks 設(shè)計(jì)比賽 網(wǎng)頁(yè)制作 web標(biāo)準(zhǔn) 用戶體驗(yàn) UE photoshop Dreamweaver Studio8 Flash 手繪 CG
站點(diǎn)最新 站點(diǎn)最新列表
周大福“敬•自然”設(shè)計(jì)大賽開(kāi)啟
國(guó)際體驗(yàn)設(shè)計(jì)大會(huì)7月將在京舉行
中國(guó)國(guó)防科技信息中心標(biāo)志征集
云計(jì)算如何讓安全問(wèn)題可控
云計(jì)算是多數(shù)企業(yè)唯一擁抱互聯(lián)網(wǎng)的機(jī)會(huì)
阿里行云
云手機(jī)年終巨獻(xiàn),送禮標(biāo)配299起
阿里巴巴CTO王堅(jiān)的"云和互聯(lián)網(wǎng)觀"
1499元買(mǎi)真八核 云OS雙蛋大促
首屆COCO桌面手機(jī)主題設(shè)計(jì)大賽
欄目最新 欄目最新列表
淺談JavaScript編程語(yǔ)言的編碼規(guī)范
如何在illustrator中繪制臺(tái)歷
Ps簡(jiǎn)單繪制一個(gè)可愛(ài)的鉛筆圖標(biāo)
數(shù)據(jù)同步算法研究
用ps作簡(jiǎn)單的作品展示頁(yè)面
CSS定位機(jī)制之一:普通流
25個(gè)最佳最閃亮的Eclipse開(kāi)發(fā)項(xiàng)目
Illustrator中制作針線縫制文字效果
Photoshop制作印刷凹凸字體
VS2010中創(chuàng)建自定義SQL Rule
>> 分頁(yè) 首頁(yè) 前頁(yè) 后頁(yè) 尾頁(yè) 頁(yè)次:1/4頁(yè) 1個(gè)記錄/頁(yè) 轉(zhuǎn)到 頁(yè) 共4個(gè)記錄

藍(lán)色理想版權(quán)申明:除部分特別聲明不要轉(zhuǎn)載,或者授權(quán)我站獨(dú)家播發(fā)的文章外,大家可以自由轉(zhuǎn)載我站點(diǎn)的原創(chuàng)文章,但原作者和來(lái)自我站的鏈接必須保留(非我站原創(chuàng)的,按照原來(lái)自一節(jié),自行鏈接)。文章版權(quán)歸我站和作者共有。

轉(zhuǎn)載要求:轉(zhuǎn)載之圖片、文件,鏈接請(qǐng)不要盜鏈到本站,且不準(zhǔn)打上各自站點(diǎn)的水印,亦不能抹去我站點(diǎn)水印。

特別注意:本站所提供的攝影照片,插畫(huà),設(shè)計(jì)作品,如需使用,請(qǐng)與原作者聯(lián)系,版權(quán)歸原作者所有,文章若有侵犯作者版權(quán),請(qǐng)與我們聯(lián)系,我們將立即刪除修改。

您的評(píng)論
用戶名:  口令:
說(shuō)明:輸入正確的用戶名和密碼才能參與評(píng)論。如果您不是本站會(huì)員,你可以注冊(cè) 為本站會(huì)員。
注意:文章中的鏈接、內(nèi)容等需要修改的錯(cuò)誤,請(qǐng)用報(bào)告錯(cuò)誤,以利文檔及時(shí)修改。
不評(píng)分 1 2 3 4 5
注意:請(qǐng)不要在評(píng)論中含與內(nèi)容無(wú)關(guān)的廣告鏈接,違者封ID
請(qǐng)您注意:
·不良評(píng)論請(qǐng)用報(bào)告管理員,以利管理員及時(shí)刪除。
·尊重網(wǎng)上道德,遵守中華人民共和國(guó)的各項(xiàng)有關(guān)法律法規(guī)
·承擔(dān)一切因您的行為而直接或間接導(dǎo)致的民事或刑事法律責(zé)任
·本站評(píng)論管理人員有權(quán)保留或刪除其管轄評(píng)論中的任意內(nèi)容
·您在本站發(fā)表的作品,本站有權(quán)在網(wǎng)站內(nèi)轉(zhuǎn)載或引用
·參與本評(píng)論即表明您已經(jīng)閱讀并接受上述條款
推薦文檔 | 打印文檔 | 評(píng)論文檔 | 報(bào)告錯(cuò)誤  
專業(yè)書(shū)推薦 更多內(nèi)容
網(wǎng)站可用性測(cè)試及優(yōu)化指南
《寫(xiě)給大家看的色彩書(shū)1》
《跟我去香港》
眾妙之門(mén)—網(wǎng)站UI 設(shè)計(jì)之道
《Flex 4.0 RIA開(kāi)發(fā)寶典》
《贏在設(shè)計(jì)》
犀利開(kāi)發(fā)—jQuery內(nèi)核詳解與實(shí)踐
作品集 更多內(nèi)容

雜⑦雜⑧ Gold NORMANA V2