JS内存生命周期

197 阅读3分钟

JS内存生命周期通常可以划分为三个阶段:分配内存--内存的读与写--释放内存

分配内存
//按照不同的数据类型分配内存空间,这里分两类来看
基本类型:大小固定、体积轻量、相对简单,NumberStingBooleanundefinednullSymbol,存储在JS的栈内存中
引用类型:比较复杂、占用空间较大、且大小不定, ObjectArrayFunction等,存储在JS的堆内存中
访问数据
访问基本类型:从栈中直接获取变量的值
访问引用类型:从栈中获取变量对应对象的引用(即地址),然后根据引用再去堆内存空间查询,最后拿到数据
垃圾回收
概念:回收不再需要使用的变量,释放被占用的内存空间
垃圾回收机制:JS具有自动垃圾回收机制,会定期对无效变量进行回收
垃圾回收算法:
1.引用计数法  //当我们用一个变量指向一个值时,就创建了一个针对这个值的 “引用”
	在引用计数法的机制下,内存中的每一个值都会对应一个引用计数。当垃圾收集器感知到某个值的引用计数为0时,就会将它的内存释放掉
	//引用计数法的缺陷,就是无法判断循环引用场景下的 “垃圾”,这也是它退出历史舞台的原因
2.标记清除法
    在标记清除算法中,根据变量是否可抵达,来决定是否清除
    这个算法有两个阶段,分别是标记阶段和清除阶段
    标记阶段:垃圾收集器会先找到根对象,从根对象出发,扫描所有可以通过根对象触及的变量,这些变量会被标记为 “可抵达”
    清除阶段:没有被标记为 “可抵达” 的变量,就会被清除
附加
减少垃圾回收:

虽然浏览器可以进行垃圾自动回收,但是当代码比较复杂时,垃圾回收所带来的代价比较大,所以应该尽量减少垃圾回收。

//这里提供两条使用频率最高的优化方式
1.对数组进行优化:通过将数组的长度设置为0,以此来清空数组	//如果给数组赋值为[],会同时会创建一个新的空对象
2.对对象进行优化: 对象尽量复用,对于不再使用的对象,就将其设置为null,尽快被回收
内存泄漏
内存泄漏:该释放的变量没有被释放,导致内存占用不断升高,造成性能恶化,系统崩溃
内存泄漏成因:
1.没有声明就被赋值,而产生的全局变量
2.忘记清除定时器
//以上两条最为常见,另外还有闭包可能造成变量持续占用内存,导致内存泄漏