面试中老是会遇到 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
分代回收内存
增量回收
空闲时间回收