js内存机制-详细导图解读

41 阅读2分钟

v8引擎

20210119212856-lqkkneu-垃圾回收机制.jpg

是什么

机制: 为变量分配内存,空间,不再需要,回收内存。

解决什么问题:

内存效率

方式

标记清除,引用计数

工程中怎么优化

dom,等引用不再使用,时要手动去进行移除,避免内存泄漏,定时器卸载时期清除,不合理的闭包。

怎么判断什么是可回收,不可回收

就是先去标记变量,依赖可抵达算法,不可抵达变量,进行清除,全局变量处于栈底部,最后清除,局部变量再函数执行完弹出栈,再去清除

循环引用

  1. 基本引用
Javascript
1let obj = {}; // 创建一个对象,此时obj是这个对象的唯一引用,引用计数为1。
2let anotherRef = obj; // 另一个变量anotherRef也指向这个对象,引用计数增加到2。

在这个阶段,这个对象有两个引用:objanotherRef,因此其引用计数为2。

减少引用

  1. 减少引用计数
Javascript
1anotherRef = null; // 将anotherRef设置为null,减少了对象的一个引用,引用计数回到1。

这里,我们断开了anotherRef与之前对象的连接,导致该对象的引用计数减1,变为1。

  1. 对象不再被引用
Javascript
1obj = {}; // obj现在指向一个新的对象,原对象没有任何引用指向它了,引用计数变为0。

通过让obj指向一个新的对象,我们断开了与最初创建的对象的最后联系,使得那个对象的引用计数降为0。根据引用计数算法,此时这个对象被视为垃圾,可以被垃圾回收器回收。

循环引用问题

引用计数的一个主要问题是处理循环引用时可能导致内存泄漏。考虑以下情况:

Javascript
1function createCycle() {
2    let obj1 = {};
3    let obj2 = {};
4    obj1.ref = obj2; // obj1有一个属性引用obj2
5    obj2.ref = obj1; // obj2有一个属性引用obj1
6    return obj1;
7}
8
9let cycleObj = createCycle(); // 创建循环引用
10// 即使后续没有对cycleObj的直接引用,obj1和obj2由于互相引用,引用计数不会降为0。