JS 垃圾收集

來源:互聯網
上載者:User

標籤:

JS具有自動垃圾收集機制;也就是說,執行環境會管理代碼執行過程中使用的記憶體。

 

一、局部變數的生命週期

局部變數只在函數執行過程中存在。

在這個過程中,會為局部變數在棧(或堆)記憶體上分配相應的空間,以便儲存它們的值。然後在函數中使用這些變數,直到函數執行結束;然後釋放記憶體。

 

二、標記清除

當變數進入環境,就將這個變數標記為“進入環境”;從邏輯上講,永遠不能釋放進入環境的變數所佔的記憶體;當變數離開環境時,則將其標記為“離開環境”。

 

三、管理記憶體

為執行環境中的代碼儲存必要的資料;一旦資料不再有用,最好通過將其設定為null,來釋放其引用——這個做法叫做解除引用;這個方法適用於大多數全域變數和全域對象的屬性。局部變數會在它們離開執行環境時自動解除引用。

解除一個值的引用並不意味著自動回收該值所佔的記憶體;解除引用的真正作用在於,讓值脫離執行環境,以便垃圾收集器下次運行時將其收回。

 

四、閉包與記憶體回收

範圍鏈是一個對象列表,不是綁定的棧;

每次調用JS函數的時候,都會為之建立一個新的對象來儲存局部變數,謂之“變數對象”;把這個對象添加到範圍鏈中,當函數返回的時候,就從範圍鏈中將這個變數對象刪除。

如果不存在嵌套的函數,也沒有其他引用指向這個變數對象,它就會被當做記憶體回收掉。

如果定義了嵌套的函數,每個嵌套的函數都各自對應一條範圍鏈,並且這個範圍鏈指向一個變數對象。

如果這些嵌套函數對象在外部函數中儲存下來,那麼它們也會和所指向的變數對象一樣當做記憶體回收。

但是如果這個函數定義了嵌套的函數,並將它作為值返回或者儲存在某處的屬性裡,這時就會有一個外部參考指向這個嵌套的函數,它就不會被當做記憶體回收,並且他所指向的變數對象也不會被當做記憶體回收。

JS 垃圾收集

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.