JS類庫(kù)Bindows1.3中的內(nèi)存釋放方式分析
更新時(shí)間:2007年03月08日 00:00:00 作者:
我在前段時(shí)間介紹過IE中JavaScript腳本Memory Leak的問題,后來在幾位熱心網(wǎng)友的討論下,基本認(rèn)可了內(nèi)存泄露的
何謂"仔細(xì)"呢?就是說在有對(duì)象相互引用的時(shí)候,在對(duì)象丟棄時(shí)(不一定是頁(yè)面refresh)斷開彼此的引用鏈,特別是腳本中創(chuàng)建的對(duì)象和DHTML中的對(duì)象間的引用;清除HTML元素中的所有自定義屬性;清除所有HTML元素中的事件處理函數(shù)回調(diào);對(duì)數(shù)組在廢棄時(shí)盡力delete掉內(nèi)部元素。
最重要的就是,盡量不創(chuàng)建冗余的腳本對(duì)象和DHTML元素對(duì)象,能通過修改屬性來達(dá)到的效果,即使麻煩一些也不重新生成新的對(duì)象。
通過上面的步驟后,IE的內(nèi)存使用增長(zhǎng)率有所下降??墒侨匀徊荒芡耆珴M足對(duì)復(fù)雜的腳本運(yùn)行的支持(接近Bindows這種復(fù)雜程度),體現(xiàn)在以下幾點(diǎn):
一、在腳本執(zhí)行過程中,內(nèi)存使用量仍然是個(gè)只增不減的過程;
二、使用最小化IE窗口方式強(qiáng)制IE進(jìn)行GC,只能GC物理內(nèi)存,對(duì)虛擬內(nèi)存無效;
三、頁(yè)面跳離(URL改變)原腳本執(zhí)行域,內(nèi)存釋放量太少甚至不釋放;
四、必須關(guān)閉IEXPLORE.EXE進(jìn)程(即所有IE窗口),才能完全釋放IE所使用的內(nèi)存。
今天突然想起來久違的Bindows,跑去一看,2月底release了一個(gè)1.3版本,于是開始運(yùn)行主頁(yè)上面給的demo。效果不用說了,自己去看一下就行了,效率也相當(dāng)?shù)母摺emo里還有一個(gè)類似多維數(shù)據(jù)顯示的GRID,居然還支持行和列的表頭都固定。炫已經(jīng)是bindows亙古不變的特點(diǎn)了,在還沒有被迷昏前,我想起應(yīng)該看看Bindows對(duì)內(nèi)存的處理怎么樣?真是不看不知道,一看嚇一跳!
打開www.bindows.net,我的IE內(nèi)存使用量在(28PM+18VM)M左右,打開它的demo program。內(nèi)存上到(38PM+35VM)M左右,然后再操作了幾下,內(nèi)存到了(80PM+75VM)M左右。于是關(guān)掉demo窗口,IE釋放了大概15M左右內(nèi)存,就停在(70PM+70VM)M的水平,在改變當(dāng)前IE的URL,跳到了google,IE的內(nèi)存使用量似乎還是沒有減少@_@。哈哈,Bindows也有Memory Leak~。真是小人得志,555... 過了一段短時(shí)間再看,IE的內(nèi)存使用降到和開啟IE時(shí)差不多了:)。真實(shí)好消息,看來不能再冤枉IE了,于是開始跟蹤Bindows在onunload時(shí)的處理代碼。
怎么能一下就跳到onunload的代碼里去呢?這里有個(gè)hack,先對(duì)IE按下Alt+V,u,b(需要uncheck IE options高級(jí)中的"禁止腳本調(diào)試",菜單View里才有U快捷鍵選項(xiàng))。然后立即關(guān)閉Bindows的演示dome窗口,選擇VS.NET 2003作為Script調(diào)試器,就直接跳到onunload的入口處了。
在管理IE中的腳本內(nèi)存使用中,Bindows做的很非常周到的。復(fù)雜對(duì)象都實(shí)現(xiàn)了完備的dispose方法,用來作什么呢?在被調(diào)用時(shí),首先切斷DHTML對(duì)象實(shí)例和腳本對(duì)象實(shí)例的引用鏈;清除全局cache變量中的數(shù)據(jù),使用delete關(guān)鍵字;使用attachEvent方式導(dǎo)入的事件處理函數(shù),需要detach;其它事件處理回調(diào),使用賦null的方式清空;切斷腳本對(duì)象之間的parent或child關(guān)系引用鏈。
這里有點(diǎn)使人迷惑的是,IE的GC的觸發(fā)是不確定的(目前知道的確定觸發(fā)就是最小化IE窗口),就是你做好了上述工作,在你的頁(yè)面剛onload時(shí),內(nèi)存也是不會(huì)立即釋放的。不過一段時(shí)間使用后,IE使用的內(nèi)存會(huì)減少。所以就不用懷疑先前討論的方法了,并且除了"切斷腳本對(duì)象之間的parent或child關(guān)系引用鏈"這一點(diǎn)外,Bindows的dispose的原理和處理方法我前面討論基本一致。
注:PM物理內(nèi)存,VM虛擬內(nèi)存。都可以在任務(wù)管理器中查看。
何謂"仔細(xì)"呢?就是說在有對(duì)象相互引用的時(shí)候,在對(duì)象丟棄時(shí)(不一定是頁(yè)面refresh)斷開彼此的引用鏈,特別是腳本中創(chuàng)建的對(duì)象和DHTML中的對(duì)象間的引用;清除HTML元素中的所有自定義屬性;清除所有HTML元素中的事件處理函數(shù)回調(diào);對(duì)數(shù)組在廢棄時(shí)盡力delete掉內(nèi)部元素。
最重要的就是,盡量不創(chuàng)建冗余的腳本對(duì)象和DHTML元素對(duì)象,能通過修改屬性來達(dá)到的效果,即使麻煩一些也不重新生成新的對(duì)象。
通過上面的步驟后,IE的內(nèi)存使用增長(zhǎng)率有所下降??墒侨匀徊荒芡耆珴M足對(duì)復(fù)雜的腳本運(yùn)行的支持(接近Bindows這種復(fù)雜程度),體現(xiàn)在以下幾點(diǎn):
一、在腳本執(zhí)行過程中,內(nèi)存使用量仍然是個(gè)只增不減的過程;
二、使用最小化IE窗口方式強(qiáng)制IE進(jìn)行GC,只能GC物理內(nèi)存,對(duì)虛擬內(nèi)存無效;
三、頁(yè)面跳離(URL改變)原腳本執(zhí)行域,內(nèi)存釋放量太少甚至不釋放;
四、必須關(guān)閉IEXPLORE.EXE進(jìn)程(即所有IE窗口),才能完全釋放IE所使用的內(nèi)存。
今天突然想起來久違的Bindows,跑去一看,2月底release了一個(gè)1.3版本,于是開始運(yùn)行主頁(yè)上面給的demo。效果不用說了,自己去看一下就行了,效率也相當(dāng)?shù)母摺emo里還有一個(gè)類似多維數(shù)據(jù)顯示的GRID,居然還支持行和列的表頭都固定。炫已經(jīng)是bindows亙古不變的特點(diǎn)了,在還沒有被迷昏前,我想起應(yīng)該看看Bindows對(duì)內(nèi)存的處理怎么樣?真是不看不知道,一看嚇一跳!
打開www.bindows.net,我的IE內(nèi)存使用量在(28PM+18VM)M左右,打開它的demo program。內(nèi)存上到(38PM+35VM)M左右,然后再操作了幾下,內(nèi)存到了(80PM+75VM)M左右。于是關(guān)掉demo窗口,IE釋放了大概15M左右內(nèi)存,就停在(70PM+70VM)M的水平,在改變當(dāng)前IE的URL,跳到了google,IE的內(nèi)存使用量似乎還是沒有減少@_@。哈哈,Bindows也有Memory Leak~。真是小人得志,555... 過了一段短時(shí)間再看,IE的內(nèi)存使用降到和開啟IE時(shí)差不多了:)。真實(shí)好消息,看來不能再冤枉IE了,于是開始跟蹤Bindows在onunload時(shí)的處理代碼。
怎么能一下就跳到onunload的代碼里去呢?這里有個(gè)hack,先對(duì)IE按下Alt+V,u,b(需要uncheck IE options高級(jí)中的"禁止腳本調(diào)試",菜單View里才有U快捷鍵選項(xiàng))。然后立即關(guān)閉Bindows的演示dome窗口,選擇VS.NET 2003作為Script調(diào)試器,就直接跳到onunload的入口處了。
在管理IE中的腳本內(nèi)存使用中,Bindows做的很非常周到的。復(fù)雜對(duì)象都實(shí)現(xiàn)了完備的dispose方法,用來作什么呢?在被調(diào)用時(shí),首先切斷DHTML對(duì)象實(shí)例和腳本對(duì)象實(shí)例的引用鏈;清除全局cache變量中的數(shù)據(jù),使用delete關(guān)鍵字;使用attachEvent方式導(dǎo)入的事件處理函數(shù),需要detach;其它事件處理回調(diào),使用賦null的方式清空;切斷腳本對(duì)象之間的parent或child關(guān)系引用鏈。
這里有點(diǎn)使人迷惑的是,IE的GC的觸發(fā)是不確定的(目前知道的確定觸發(fā)就是最小化IE窗口),就是你做好了上述工作,在你的頁(yè)面剛onload時(shí),內(nèi)存也是不會(huì)立即釋放的。不過一段時(shí)間使用后,IE使用的內(nèi)存會(huì)減少。所以就不用懷疑先前討論的方法了,并且除了"切斷腳本對(duì)象之間的parent或child關(guān)系引用鏈"這一點(diǎn)外,Bindows的dispose的原理和處理方法我前面討論基本一致。
注:PM物理內(nèi)存,VM虛擬內(nèi)存。都可以在任務(wù)管理器中查看。
您可能感興趣的文章:
- Android系統(tǒng)進(jìn)程間通信Binder機(jī)制在應(yīng)用程序框架層的Java接口源代碼分析
- jquery中l(wèi)ive()方法和bind()方法區(qū)別分析
- C#中DataBindings用法實(shí)例分析
- jQuery中trigger()與bind()用法分析
- Android4.1中BinderService用法實(shí)例分析
- JQuery中Bind()事件用法分析
- javascript中call,apply,bind的用法對(duì)比分析
- PHP PDOStatement:bindParam插入數(shù)據(jù)錯(cuò)誤問題分析
- jQuery中的.bind()、.live()和.delegate()之間區(qū)別分析
- js apply/call/caller/callee/bind使用方法與區(qū)別分析
- Javascript Function.prototype.bind詳細(xì)分析
相關(guān)文章
JS實(shí)現(xiàn)動(dòng)態(tài)給標(biāo)簽控件添加事件的方法示例
這篇文章主要介紹了JS實(shí)現(xiàn)動(dòng)態(tài)給標(biāo)簽控件添加事件的方法,結(jié)合實(shí)例形式分析了javascript簡(jiǎn)單實(shí)現(xiàn)動(dòng)態(tài)添加事件的相關(guān)操作技巧,需要的朋友可以參考下2017-05-05Hammer.js+輪播原理實(shí)現(xiàn)簡(jiǎn)潔的滑屏功能
這篇文章主要介紹了Hammer.js+輪播原理實(shí)現(xiàn)簡(jiǎn)潔的滑屏功能的相關(guān)資料,需要的朋友可以參考下2016-02-02JavaScript實(shí)現(xiàn)環(huán)繞鼠標(biāo)旋轉(zhuǎn)效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)環(huán)繞鼠標(biāo)旋轉(zhuǎn)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01JS實(shí)現(xiàn)判斷數(shù)組是否包含某個(gè)元素示例
這篇文章主要介紹了JS實(shí)現(xiàn)判斷數(shù)組是否包含某個(gè)元素,涉及javascript屬性操作與正則判斷相關(guān)使用技巧,需要的朋友可以參考下2019-05-05javascript 二維數(shù)組的實(shí)現(xiàn)與應(yīng)用
javascript沒有二維數(shù)組.所有自定義了一個(gè)數(shù)組類,下面是實(shí)例代碼,需要的朋友可以參考下。2010-03-03javascript之分片上傳,斷點(diǎn)續(xù)傳的實(shí)際項(xiàng)目實(shí)現(xiàn)詳解
在本篇文章里小編給大家整理了關(guān)于javascript之分片上傳,斷點(diǎn)續(xù)傳的實(shí)際項(xiàng)目實(shí)現(xiàn)的詳細(xì)內(nèi)容,有需要的朋友們學(xué)習(xí)下。2019-09-09