这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战
堆内存释放问题:如果当前的堆被占用了【地址被引用,则不能释放,如果不被引用,浏览器会在空闲的时候释放它】
GC:浏览器的垃圾【内存】回收机制
- 引用计数【被占用一次计数累加1,当取消应用再减去1,当减到零,会把其释放】
- 引用检测/标记清除【被占用后做一个标记,当移除引用,取消标记,在浏览器空闲的时候,会把所有未标记的内存回收】
null[空对象指针,不开辟任何的位置]
请看下面这个例子 前端一定要学会画这种图,协助我么能清晰地理解分析题目~主要是闭包相关的以及内存的释放
// EC(G)
// x=10
// fn = 0x000 [[scope]:EC(G)]
let x= 10;
function fn() {
// EC(FN) 闭包
// y = 20
// f=0x001[[scope]:EC(FN)]
let y = 20;
function f() {
console.log(y)
}
window.f = f;
}
fn();
fn = null; // 把0x000堆释放掉,但是之前形成上下文不受影响
f(); // ->20
window.f = null //把0x001堆释放掉,此时EC(FN)中没有被外面占用的内容了,它也被释放掉