初级前端基础:JavaScript垃圾回收机制

初级前端基础:JavaScript垃圾回收机制

工作中的疑惑,面试时的难题,总让人无从下手,网上搜索,结果七零八碎,期待系统学习,全网推荐的权威书籍,购买完毕后放在墙角吃灰,没时间看,也不知从哪看起。

本专栏将拆解权威书籍重点章节,让您在空闲时间完成前端进阶。

JavaScript高级程序设计(第四版)是全网推荐的权威入门书籍,本章将对书中JS垃圾回收机制部分的重点内容进行系统性的拆解。

一 执行上下文与作用域

垃圾回收机制是基于JS上下文机制和作用域链来实现的,所以在正式了解垃圾回收之前,我们需要了解一些基础概念。

变量对象:每个上下文有一个关联的变量对象,储存着该上下文中定义的所有变量和函数,无法直接访问,后台处理数据用。

全局上下文:最外层的上下文,也在上下文栈的最底层(第一个压入),关联的变量对象即为window对象。

上下文栈:当进入新的上下文时(如进入一个函数),新上下文推入上下文栈,当一个上下文环境结束时(如函数执行完毕),该上下文出栈,控制器返回上一个上下文。

作用域链:上下文代码执行时创建,决定了在查找变量和函数时,变量对象的访问顺序,当前上下文位于作用域链顶端,也位于上下文栈栈顶,是查找的首选,后向栈底方向依次查找。

二 垃圾回收

思路:周期性的确定哪个变量不会被使用,然后释放它的内存(如函数中的局部变量在执行完毕后不再使用)。

2.1 如何标记未使用的变量?

标记清理:常用,变量在进入上下文与离开上下文时添加不同标记,当垃圾回收程序运行时,先标记所有变量,再将在上下文中(即进入上下文标记)的变量标记删除,剩下带有清理标记的变量被清理。

引用计数:不常用,记录变量的引用次数,当其为0时,代表无法再访问该值,可以清理。但在循环时可能相互引用而内存泄漏。如对象A–B相互引用,两者引用数为2,当函数结束后,引用数也不会归0。在IE9后不再使用该种方法。

垃圾回收是JS自发性行为,某些浏览器也可主动触发,但不推荐这么做。

2.2 内存优化管理

解除引用:不再必要的数据设置为null,从而释放引用。尤其是在全局变量和对象中,因为不在上下文的变量会自动解除引用。

const & let:有助于尽早回收无用数据。

隐藏类优化:当两个对象来自于同一个构造函数创建的实例时,它们在v8引擎中归属于同一个隐藏类,动态添加属性和时候delete删除属性都会创建并归属新的隐藏类,影响性能,正确的做法是将无用的性能置null。

内存泄漏:大多由不合理的引用导致。(意外的全局变量 | 引用的外部变量的定时器 | 引用了局部变量的闭包)

静态分配与对象池:降低对象更替的速度,以降低垃圾回收程序的运行频率。


本章已结束,感谢您的阅读

点赞,评论,关注,及收藏都会使作者更有动力哦 ^-^

你可能感兴趣的:(#,内存泄漏,垃圾回收,js)