面試中老是會遇到 JavaScript 垃圾回收的問題,特地上網查了一下,終於找到一個描述的比較詳細的了, 在這裏與你們 分享一下,本身也作一個備份,以便隨時查看面試
垃圾回收是一種自動的 內存管理 機制算法
當一個電腦上的動態內存不在須要時,就應該予以釋放,以讓出內存,這種內存資源管理,成爲垃圾回收函數
JavaScript 中的內存管理是自動執行的,並且是不可見的。優化
建立基本類型、對象、函數... 全部這些都是須要內存。spa
當再也不須要某樣東西時會發生什麼?JavaScript 引擎是如何發現並清理它?code
// user 具備對象的引用
let user = {
name: 'John'
}
// 全局變量「user」引用對象 {name:「John」}
// John 的 「name」 屬性存儲一個基本類型,所以它被繪製在對象中
// user 的值被覆蓋,則引用丟失
user = null
// 如今 John 變成不可達的狀態,沒有辦法訪問它,沒有對它的引用。垃圾回收器將丟棄 John 數據並釋放內存
複製代碼
user
複製到 admin
// user 具備對象的引用
let user = {
name: 'John'
}
let admin = user
user = null
// 該隊愛那個讓然能夠經過 admin 全局訪問變量,因此它在內存中
admin = null
// user 和 admin 都被 null 覆蓋,那麼它能夠被釋放
複製代碼
function marry (man, woman) {
woman.husband = man
man.wife = woman
return {
father: man,
mother: woman
}
}
let family = marry({
name: 'John'
}, {
name: 'Ann'
})
// 函數 marry 經過給兩個對象彼此提供引用來「聯姻」它們,並返回一個包含兩個對象的新對象.
// 目前爲止,全部對象都是可訪問的
// 刪除兩個引用
delete family.father
delete family.mother.husband
// 僅僅刪除這兩個引用中的一個是不夠的,由於全部對象仍然是可訪問的
// 把這兩個都刪除,就能夠看到 John 不在有傳入的引用
// 該對象引入其餘對象可有可無
// 該對象被引入,纔會作可達性分析
// 所以,John 如今是不可訪問的,並將從內存中刪除全部不可訪問的數據
複製代碼
有可能整個相互鏈接的對象變得不可訪問並從內存中刪除對象
// 源對象同上
// 而後 =>
family = null
// John 和 Ann 仍然鏈接在一塊兒,都有傳入的引用
// 但 "family" 對象已經從根上斷開了連接,再也不有對它的引用,所以下面的整個塊變得不可到達,並將被刪除
複製代碼
基本的垃圾回收算法稱爲 「標記-清除」 ,按期執行如下「垃圾回收」步驟:進程
優化 =>ip
分代回收內存
增量回收
空閒時間回收