javascript記憶體洩漏

2021-06-18 03:33:24 字數 1566 閱讀 5621

網搜結果: 1、

迴圈引用(circular references)

— ie瀏覽器的com元件產生的物件例項和網頁指令碼引擎產生的物件例項相互引用,就會造成記憶體洩漏。 

這也是web頁面中我們遇到的最常見和主要的洩漏方式; 

舉例:

dom物件與js物件相互引用。範例: 

function encapsulator(element)  

new encapsulator(document.getelementbyid('mydiv')); 

解決方法: 

在onunload事件中寫上: document.getelementbyid('mydiv').myprop = null; 

2、內部函式引用(closures) 

— closures可以看成是目前引起大量問題的迴圈應用的一種特殊形式。由於依賴指定的關鍵字和語法結構, 

closures呼叫是比較容易被我們發現的; 

舉例:a、給dom物件新增的屬性是乙個物件的引用。範例: 

var myobject = {}; 

document.getelementbyid('mydiv').myprop = myobject; 

解決方法: 

在window.onunload事件中寫上: document.getelementbyid('mydiv').myprop = null; 

b、給dom物件用attachevent繫結事件。範例: 

function doclick() {} 

element.attachevent("onclick", doclick); 

解決方法: 

在onunload事件中寫上: element.detachevent('onclick', doclick); 

3、頁面交叉洩漏(cross-page leaks) 

— 頁面交叉洩漏其實是一種較小的洩漏,它通常在你瀏覽過程中,由於dom插入順序引起。下面我們 

會討論dom插入順序的問題,在那個示例中你會發現只需要改動少量的**,我們就可以避免物件薄計對物件構建帶來的影響; 

舉例:

var parentdiv = document.createelement("div"); 

var childdiv = document.createelement("div"); 

解決方法: 

var parentdiv = document.createelement("div"); 

var childdiv = document.createelement("div"); 

4、貌似洩漏(pseudo-leaks) 

— 這個不是真正的意義上的洩漏,不過如果你不了解它,你可能會在你的可用記憶體資源變得越來越少的時候很鬱悶

舉例:反覆重寫同乙個屬性會造成記憶體大量占用(但關閉ie後記憶體會被釋放)。範例: 

for(i = 0; i < 5000; i++)  

這種方式相當於定義了5000個屬性! 

解決方法: 

其實沒什麼解決方法:p~~~就是程式設計的時候盡量避免出現這種情況咯~~ 

參考文章:

記憶體洩漏和記憶體溢位 記憶體洩漏和記憶體溢位

記憶體洩漏 是指申請的記憶體空間使用完畢之後未 一次記憶體洩露危害可以忽略,但若一直洩漏,無論有多少記憶體,遲早都會被占用光,最終導致程式crash。因此,開發中我們要盡量避免記憶體洩漏的出現 記憶體溢位 是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用。通俗理解就是記憶體不夠用了,通常在執行大...

wxWidgets delete記憶體洩漏

定義乙個結構typedef tag struct customnode struct,再定義乙個wxarrayptrvoid m nodearray 在程式的初始化過程裡 for wxint32 i 0 i 5 i node struct ptemp new node struct ptemp a ...

PHP記憶體洩漏

如果php物件存在遞迴引用,就會出現記憶體洩漏。這個bug在php裡已經存在很久很久了,先讓我們來重現這個bug,如下 class foo class bar for i 0 i 100 i 執行以上 你會發現,記憶體使用量本應該不變才對,可實際上卻是不斷增加,unset沒有完全生效。現在的開發很多...