今天突然想起了JS的垃圾回收機制,下面來簡單說一下,不足之處還請大神指教
有一本資料書有大概有這么一段話,大致是這么說的
由於字符串,數組,對象的大小不定,所以只有知道他們的大小之后才能動態給他們分配內存空間
JS 程序每次創建字符串,數組,對象時,解釋器都要動態給他們分配內存空間來存儲這個實體。像這樣
需要動態來分配內存空間的,最終都要釋放這個內存,以便這個內存能夠被再次使用、不然的話,JS 解釋器
會消耗完系統中可用的內存。造成內存泄漏。
JS解釋器可以檢測到程序何時不再使用一個對象了,確定不再使用時,然后把它所占的內存釋放掉。
例:
var a="before";
var b="after";
a=b;
這時剛才的a=“before”,before就沒有被用了,因為a此時指向了after。所以before所點的內存就會被釋放掉。
再說下垃圾回收的原理,
常用的有兩種
1,標記清楚。這個是用的最多的,
當變量進入執行環境,就會被標記為進入環境,離開環境后會被標記為離開環境,在環境中的變量不會被
釋放,因為隨時可能被用到,
垃圾收集器在運行時會給內存中所有的變量加上標記,但是會去掉那些環境中的變量,以及被環境中的變量引用的
變量,如果后續在被加上標記就會被視為准備刪除的變量。最后垃圾收集器銷毀這些帶標記的變量,回收他們所
占的內存。
2.引用計數
引用計數的意思是說。當聲明一個變量后,這個變量指向的內存地址就會標記為1(因為被這個值被引用了一次)
如果還有變量等於這個值,就會再加1。相反就會減1.當等於0時,就表示沒有被引用了,就會被回收。
這種方法有缺陷。如果兩個變量相互引用時,就會導致標記值永遠不會等於0.內存永遠不會被回收。如果很多就會出
內存泄漏。
例;
var a = new Object();
var b = new Object();
a.someVal = b;
b.someNumber =a ;
a和b通過各自屬性的相互引用,兩個對象的引用次數都 是0;