1. 程式人生 > 其它 >JavaScript 垃圾回收機制

JavaScript 垃圾回收機制

1. JavaScript 垃圾回收機制的思想很簡單:確定哪個變數不會再被使用,然後釋放它所佔用的記憶體空間,垃圾回收程式每隔一段時間就會自動執行一次。但是我們需要對變數進行跟蹤,標記不會再使用的變數。

2. 瀏覽器史上兩種主要的標記策略:

(1)標記清理:是 JavaScript 最常用的垃圾回收策略,當變數進入一個執行上下文時,它會被打上一個“處於上下文”的標記,當它離開此執行上下文時,它會被打上一個“離開上下文”的標記。當垃圾回收程式執行時,會標記記憶體中儲存的所有變數,然後將處於上下文的變數的標記清除掉,在此之後,仍然有標記的變數則會被垃圾回收程式進行記憶體清理,銷燬並回收它們的記憶體。

(2)引用計數:此種策略不太常用,其思想為對每個值記錄它被引用的次數。當一個變數被另一個變數引用著時,它的引用數+1,當儲存對該變數引用的變數被其他值覆蓋時,引用數-1。那麼當一個變數的引用數為0時,說明程式不會再用到它,垃圾回收程式就會清理掉這個變數。當時這種策略存在某些問題:在兩個變數迴圈引用時,即 A 引用 B,而 B 又引用 A 時,那它們兩個永遠都不會被回收。

function problem() {
  let objectA = new Object();
  let objectB = new Object();
  objectA.someOtherObject = objectB;
  objectB.anotherObject 
= objectA; }

這段程式碼在標記清理策略中沒有問題,因為函式結束後,它們所處的執行上下文銷燬,因此這兩個物件不在任何上下文中,可以被回收。但在引用計數時,不會被回收掉,如果此函式重複執行,那麼會有大量記憶體無法被回收。