如何預防和對付瀏覽器的Memory Leak?

2021-04-13 22:23:54 字數 2850 閱讀 9467

★首先,需要了解一下一般是什麼樣的原因導致了memory-leak,這樣才能有意識地避免寫出嚴重memory-leak的js**和快速查詢到問題的根源,強烈建議通篇閱讀一下下面的這篇文章:

understanding and solving internet explorer leak patterns

★根據經驗總結出如下幾個需要注意的地方:

[ 編輯]

new 大物件的時候記得監聽window的unload(或者beforeunload),來銷毀當前的例項

com.trs.test.bigman.prototype=.bind(

this

),false

);               

},........

function $destroy(_obj)

catch

(err) }

} 這樣,當頁面進行重新整理或者切換時,可以保證將com.trs.test.bigman的當前示例進行有效地銷毀。當然,當當前例項是乙個singleton時,可以直接註冊unload/beforeunload事件銷毀該singleton,例如需要**crashboard的容器(即trsdialogcontainer,乙個singleton物件)的記憶體,像這樣子:

event.observe(window, 'unload', $destroyallboards);

function $destroyallboards()}

[編輯]

請參照understanding and solving internet explorer leak patterns中關於「cross-page leaks」的描述。

[ 編輯]

不建議用類似xx.onclick等方式來繫結事件,用prototype提供的event.observe

abutton.onclick = afunc;

event.observe(abutton, 'click', afunc);

消除由於ie事件註冊機制導致其記憶體洩漏(ie記憶體**時的引用計數方式導致了該記憶體洩漏),是prototype的event.observe之所以存在的另外乙個重要原因。

[ 編輯]

更新乙個元素的innerhtml時先刪除掉其所有子節點,或者採用element.update來更新

下面是乙個更新乙個innerhtml的實際的例子

var shtmlcontent = '.........'

shtmlcontent += '......';

shtmlcontent += '......';

........

// ohtmlele 是乙個已經在document dom 中存活的 html-element

for(;ohtmlele.childnodes.length>0;)

ohtmlele.innerhtml = shtmlcontent;

我們的element.update提供了類似的功能:

object.extend(element,

);html.textscripts(

).each(

function

(value,index)

);}, 1

);},

....... [

編輯]var shtmlcontent = '.........'

shtmlcontent += '......';

shtmlcontent += '......';

........

// ohtmlele 是乙個已經在document dom 中存活的 html-element

new insertion.after(ohtmlele, shtmlcontent);

.... [

編輯]應當避免試圖在html element 上附加方法

除非你有辦法徹底銷毀它, 對這一點建議用屬性替代方法,所以在把html element當成引數傳遞時,要注意這個引數不是普通的object,所有擴充套件此引數的操作需要謹慎,否則一旦出現memory leak,問題會非常隱蔽!

com.trs.test.bigman.prototype=,

...extendfuncs : function

(_field)

,...});

},extendprops : function

(_field)

,... [

編輯]當把html elment控制項當成引數傳遞到某個子方法(應該指非function ***(){}這樣定義的方法)中時,注意!需要將該引數的引用顯式的delete掉

下面是乙個實際使用的例子:

com.trs.test.bigman.prototype=,

... [

編輯]prototype的ajax方法未提供對transport的消毀,建議過載,或者使用ajax框架中做的過載.

部分過載方法如下:

object.extend(ajax.request.prototype,

catch

(err) }

} });

[ 編輯]

Selenium 谷歌無頭瀏覽器和預防檢測

from selenium import webdriver bro webdriver.chrome chromedriver.exe bro.get page text bro.page source print page text 無頭瀏覽器的使用 from selenium import w...

瀏覽器如何工作

吃飽沒事,隨便翻譯一篇文章。現在的瀏覽器可以做很多事,如chrome可以執行多種應用外掛程式。但我覺得你可能對如何載入展示網頁感興趣。網路是c s架構的。瀏覽器僅僅是其中的一半 客戶端 另一半是等待客戶端發請求的伺服器。首先,瀏覽器要找到web伺服器的位址。它問作業系統伺服器的名字 作業系統便查詢本...

瀏覽器和瀏覽器驅動對應版本

selenium是thoughtworks公司開發的一款開源的測試工具,主要用來做web端的自動化測試。python安裝selenium,直接使用執行pip install selenium python 命令安裝即可,預設安裝的是最新的,也就是selenium的3.x版本,以前selenium2....