敲开内存管理以及垃圾回收的大门

2021-03-26  本文已影响0人  贰玖是只猫

作为一个前端同学我们跨过了只关注实现业务功能的阶段后,会进入一个瓶颈。在这个瓶颈阶段,我们需要通过更多的知识实践来积累,让我们跨过这段平台期。前端架构、框架原理、性能优化等都是我们需要取掌握的技能。本章节就从性能优化的一个角度----JavaScript性能优化 进化吧!

内存管理

如果我们在日常的编程中不注意管理内存,会导致内存泄露, 产生浏览器崩溃等情况。

内存管理: 开发者主动申请、使用、释放内存空间

//申请
let obj = {}
//使用
obj.name = "zicoo"
//释放
obj = null

JavaScript 中的垃圾回收

可达对象

引用与可达

let obj = {name: "sam"}
let obj1 = obj
obj = null //obj 仍然可达

GC - 垃圾回收机制

常见GC算法

引用计数

核心思想: 设置引用计数器,判断当前引用数为否为0

优点:

缺点:

function fn() {
    const obj1 = {}
    const obj2 = {}

    obj1.name = obj2
    obj2.name = obj1 //obj1 obj2 循环引用 无法将引用计数器清0
}
fn()

标记清除

核心思想: 分标记和清除两个阶段

执行时间点: 当有效内存空间被耗尽的时候,会停止程序执行标记清除

标记活动对象依旧是从根出发,递归的方式遍历从根能到达的所有节点,并且标记为活动对象, 而未标记活动对象的节点则就是待回收节点

优点:

缺点:

标记整理

V8引擎

V8垃圾回收策略

V8常见GC算法

V8 新生代对象回收

新生代对象回收实现

V8 老年代对象回收

老年代对象回收实现

增量标记
程序执行与标记间隔执行,达到清理标准一起清理

细节对比

上一篇 下一篇

猜你喜欢

热点阅读