為什麼迴圈引用會導致「記憶體洩漏」

2022-07-04 00:24:14 字數 1053 閱讀 5078

首先這個問題對於現代瀏覽器(ie9+)來說已經不是問題了,這個問題其實是出現在ie8的時代了

我們主要是通過這個問題來介紹下瀏覽器的垃圾**機制:

js是有自己的一套自動垃圾**機制的,這是大部分高階語言都具備的(除了c語言),然而它的機制是什麼呢?

採用過的有2種  標記清除 和  引用計數

先明確一點現代瀏覽器採用的是標記清除

舉個栗子:

function

test()

test();

//執行完畢 之後 a、b又被標離開環境,被**。

是否**的準則是是否離開環境

而老瀏覽器採用的是引用計數

舉個栗子:

function

test() ; //

a的引用次數為0

var b = a ; //

a的引用次數加1,為1

var c =a; //

a的引用次數再加1,為2

var b ={}; //

a的引用次數減1,為1}//

test執行完後,全部變數會自動定義為undefined

//c = undefined後a的引用次數也變為0了

然而這種機制有個很嚴重的bug——迴圈引用

function

fn() ;

var b ={};

a.pro = b; //

a引用次數為1

b.pro = a;//

b引用次數為1}//

fn呼叫結束後,a=undefined,b=undefined

//這樣並沒有使得a和b的引用次數減少

//因為引用a和b的並不是b和a的本身,而是他們的屬性

//所以面對這種迴圈引用的狀況,自動**是沒辦法把引用次數降到0的

//這個時候要我們手動在結尾那新增a.pro = undefined;b.pro = undefined

JS閉包迴圈引用導致記憶體洩漏之解決方法

方法 一 主動設定js物件element為空,打破迴圈引用 function assignhandler 閉包可以監聽外部變數的變化,所以這裡把element null,也就是說外部這個變數相當於不存在了,雖然賦值是在閉包後面,閉包也能夠檢測到!所以匿名函式不會有外部的dom物件的引用,不會記憶體洩...

IOS Block迴圈引用的記憶體洩漏問題

ios 在mrc 非arc 記憶體管理方式下,中如果block呼叫了self的方法,那self的引用計數會被block 1,如果處理不當會當值記憶體洩漏。implementation isschartlineviewcontroller void dealloc here need to optim...

為什麼會陷入死迴圈

看似簡單的一段程式如下 int main 在unix linux平台下,gcc編譯執行會陷入死迴圈.因為變數 i 和陣列 j 8 是儲存在棧中,預設是由高位址向低位址方向儲存.輸出變數位址可以發現 i 儲存位置在0xbfd90dec,j 0 j 1 j 7 在記憶體的位址分別是0xbfdab05c ...