JS 的垃圾回收機制淺析


今天突然想起了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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM