任何編程語言,在運行時都須要使用到內存,好比在一個函數中, var arr = [1, 2, 3, 4, 5]; 這麼一個數組,就須要內存。javascript
可是,在使用了這些內存以後, 若是後面他們不會再被用到,可是尚未及時釋放,這就叫作內存泄露(memory leak)。若是出現了內存泄露,那麼有可能使得內存愈來愈大,而致使瀏覽器崩潰。java
C語言是經過手動分配和釋放內存的, 如經過malloc分配,經過free釋放,這種方式是比較麻煩的。而java、c#、js等是爲了解放程序員的負擔,提出了程序自動釋放內存,這種方式就是垃圾回收機制。程序員
即跟蹤記錄每一個值被引用的次數,當聲明瞭一個變量並將一個引用類型賦值給該變量時,則這個值的引用次數就是1; 相反,若是包含對這個值引用的變量又取得了另一個值,那麼這個值的引用次數就減1;當引用次數變爲0的時候,則說明沒有辦法再訪問到這個值了,因此,就能夠把其所佔用的內存空間給收回來。 這樣,垃圾收集器下次再運行時,他就會釋放哪些引用次數爲0的值所佔的內存。編程
DEMO:c#
function test(){
var a = {} ; //a的引用次數爲0
var b = a ; //a的引用次數加1,爲1
var c =a; //a的引用次數再加1,爲2
var b ={}; //a的引用次數減1,爲1
}
複製代碼
這是JavaScript中最經常使用的垃圾回收機制。當變量進入環境時,就標記這個變量爲「進入環境」,邏輯上說,永遠不能釋放進入環境的變量所佔用的內存,由於一旦進入環境就有可能隨時用到他們,當變量離開環境的時候,將其標記爲「離開環境」。數組
DEMO:瀏覽器
function test(){
var a = 10 ;
//被標記 ,進入環境
var b = 20 ;
//被標記 ,進入環境
}
test(); //執行完畢 以後 a、b又被標離開環境,被回收。
複製代碼
垃圾回收器週期性運行,若是分配的內存很是多,那麼回收工做也會很艱鉅,肯定垃圾回收時間間隔就變成了一個值得思考的問題。IE6的垃圾回收是根據內存分配量運行的,當環境中存在256個變量、4096個對象、64k的字符串任意一種狀況的時候就會觸發垃圾回收器工做,看起來很科學,不用按一段時間就調用一次,有時候會不必,這樣按需調用不是很好嗎?可是若是環境中就是有這麼多變量等一直存在,如今腳本如此複雜,很正常,那麼結果就是垃圾回收器一直在工做,這樣瀏覽器就無法兒玩兒了。編程語言
微軟在IE7中作了調整,觸發條件再也不是固定的,而是動態修改的,初始值和IE6相同,若是垃圾回收器回收的內存分配量低於程序佔用內存的15%,說明大部份內存不可被回收,設的垃圾回收觸發條件過於敏感,這時候把臨街條件翻倍,若是回收的內存高於85%,說明大部份內存早就該清理了,這時候把觸發條件置回。這樣就使垃圾回收工做職能了不少函數
1)、Javascript引擎基礎GC方案是(simple GC):mark and sweep(標記清除),即:spa
(1)遍歷全部可訪問的對象。
(2)回收已不可訪問的對象。