最近開發(fā)的時(shí)候?qū)撁媸褂昧硕〞r(shí)的局部更新,結(jié)果在ie6,7和Firefox下,一切正常,而在ie8下過上幾個(gè)小時(shí)就瀏覽器就崩潰了,顯示是內(nèi)存溢出,我以為是代碼寫的不好導(dǎo)致內(nèi)存泄露,但是ie6,7又正常,調(diào)查了一下,原來這是ie8的bug 。
問題點(diǎn)
在IE8中,生成特定Dom節(jié)點(diǎn)所占用的內(nèi)存是不會(huì)被釋放的,即使這些節(jié)點(diǎn)被刪除內(nèi)存也不會(huì)被釋放 。
內(nèi)存泄露的節(jié)點(diǎn)類型包括:form、button、input、select、textarea、a、img和objec
其他的大部分節(jié)點(diǎn)類型是不會(huì)泄露的,例如:span、div、p、table等等 。
此問題只發(fā)生在IE8,其他瀏覽器不發(fā)生 。
如果用戶按了F5,IE8會(huì)重新刷新頁面,首先它會(huì)unload window.top,這時(shí)候會(huì)釋放掉內(nèi)存 。如果頁面是iframe,則unload此iframe,沒有任何反應(yīng) 。看起來只有window.top被 unload,內(nèi)存才會(huì)被釋放 。
例子
例1
執(zhí)行下面的代碼,IE8就會(huì)泄露內(nèi)存 。

注意:
* 此例子添加了節(jié)點(diǎn),所以會(huì)泄露 。
* 在中有個(gè)div,id為“TO_AREA” 。
* 提醒一下,這里沒有閉包和循環(huán)引用 。
例2
下面的代碼沒有使用innerHTML,但是還是會(huì)泄露

注意:
* FROM_AREA 是form的id,而且這里也沒有閉包和循環(huán)引用 。
例3
這是最簡(jiǎn)單,最直接的例子:

注意:
* 如果用span來代替img,就不會(huì)有泄露了 。
這些例子只在IE8中泄露內(nèi)存,我在Windows XP, Windows Vista, Windows Server 2008, Windows Server 2008 R2和Windows 7 中的IE8都作了測(cè)試,而且使用了IE8中的IE7兼容模式和標(biāo)準(zhǔn)模式,每種情況下都會(huì)泄露 。
測(cè)試頁面
關(guān)于泄露
【內(nèi)存一直增長(zhǎng)IE8 內(nèi)存泄露的原因及解決辦法】內(nèi)存大小隨著時(shí)間的推移而增長(zhǎng),但這并不直接導(dǎo)致瀏覽器崩潰 。瀏覽器使用的內(nèi)存好像是有上限的,它似乎會(huì)從某些內(nèi)部手段來限制DHTML使用的內(nèi)存 。
內(nèi)存到達(dá)上限后,瀏覽器會(huì)自動(dòng)處理,例如彈出對(duì)話框,顯示內(nèi)存不足 。
經(jīng)過自己測(cè)試發(fā)現(xiàn) IFrame同樣存在這個(gè)問題(在IE8下)
補(bǔ)充:iframe內(nèi)存釋放
Ext 核心開發(fā)人員Jack的回答是,TabPanelItem在關(guān)閉時(shí)并不會(huì)對(duì)自定義到tab中的元素做特殊處理,這部分工作必須在控件外來完成 。另一方面,相關(guān)資料稱IE在iframe元素的回收方面存在著bug,在通常情況下應(yīng)該將該元素的src屬性值修改為”abort:blank”,并手工將其從 DOM樹上移除,然后把腳本中引用它的變量置空并調(diào)用CollectGarbage()就可以避免iframe不能正常回收所造成的內(nèi)存泄露 。

推薦閱讀
- 又談格機(jī)
- 用《Enjoy Memory》擴(kuò)大你的程序內(nèi)存到31M
- 鞋撐能一直放鞋子里嗎
- 運(yùn)行內(nèi)存8+4是什么意思
- win10荒野大鏢客2虛擬內(nèi)存不足解決方法
- 魚缸燈需要一直開嗎
- win102004版本需要內(nèi)存介紹
- 吉利博越車內(nèi)燈一直亮怎么辦
- 應(yīng)用程序錯(cuò)誤內(nèi)存不能為read解決方法
- 榮耀暢玩30多大內(nèi)存-榮耀暢玩30內(nèi)存夠用嗎
