1引用計數垃圾回收
核心:跟蹤記錄對象被引用的次數。思路是如果一個對象A被賦值給了一個變量v,則該對象A的引用計數值加1,如果變量v又被賦予其他值了,比如a="str",則該對象A的引用計數值減1.當這個引用計數值變成0時,就表明它所占的內存空間可以被回收了。
1 var A={b:4};
2 var v=A;//此時A的引用計數值為1
3 var vv=A; //此時A的引用計數值為2
4 v=9;//A的引用計數值為1
5 vv="hah";//A的引用計數值為0,當垃圾收集器下次運行時,A就被回收
如果出現了循環引用:
1 var A={b:4,c:null};
2 var B={a:4,c:null};
3
4 A.c=B; //B的引用計數值為1
5 B.c=A;//A的引用計數值為1,此時他們互相引用,就不會被回收
2標記清除
核心:當變量進入執行環境時,標記為“進入環境”,但變量離開環境時,標記為“離開環境“。當垃圾收集器遇到標記為”離開環境“的變量時,就將它們所占的內存空間回收。
1 function A(){
2 var a=12; //進入函數A時,預解析將a先申明,並被標記為”進入環境“
3 }
4 //執行完函數A後, a被標記為”離開環境“