粥里有勺糖

vuePress-theme-reco 粥里有勺糖    2018 - 2023
粥里有勺糖 粥里有勺糖

Choose mode

  • dark
  • auto
  • light
关于我
备战春秋
  • 心得总结
  • 校招考点汇总
  • 面经汇总
  • 复习自查
技术笔记
  • 技术教程
  • 模板工程
  • 源码学习
  • 技术概念
  • 个人作品
  • 学习笔记
计算机基础
  • 算法与数据结构
  • 操作系统
  • 计算机网络
  • 设计模式
  • 剑指offer
大前端
  • javascript
  • vue
  • html
  • css
  • 🌏浏览器专题
  • Web性能优化
  • regexp
  • node
面试
  • 问解
  • javascript
  • css
  • 手撕代码
  • 性能优化
  • 综合问题
  • 面经汇总
  • 小程序
手撕代码
  • 数据结构与算法
  • javascript
  • css
个人站点
  • GitHub (opens new window)
  • 博客园 (opens new window)
  • 掘金 (opens new window)
线上作品
  • 轻取(文件收集) (opens new window)
  • 个人图床 (opens new window)
  • 考勤小程序 (opens new window)
  • 时光恋人 (opens new window)
  • 在线简历生成 (opens new window)
留言板
Github (opens new window)
author-avatar

粥里有勺糖

285

文章

40

标签

关于我
备战春秋
  • 心得总结
  • 校招考点汇总
  • 面经汇总
  • 复习自查
技术笔记
  • 技术教程
  • 模板工程
  • 源码学习
  • 技术概念
  • 个人作品
  • 学习笔记
计算机基础
  • 算法与数据结构
  • 操作系统
  • 计算机网络
  • 设计模式
  • 剑指offer
大前端
  • javascript
  • vue
  • html
  • css
  • 🌏浏览器专题
  • Web性能优化
  • regexp
  • node
面试
  • 问解
  • javascript
  • css
  • 手撕代码
  • 性能优化
  • 综合问题
  • 面经汇总
  • 小程序
手撕代码
  • 数据结构与算法
  • javascript
  • css
个人站点
  • GitHub (opens new window)
  • 博客园 (opens new window)
  • 掘金 (opens new window)
线上作品
  • 轻取(文件收集) (opens new window)
  • 个人图床 (opens new window)
  • 考勤小程序 (opens new window)
  • 时光恋人 (opens new window)
  • 在线简历生成 (opens new window)
留言板
Github (opens new window)
  • JsInterview

    • js面试题
    • async 及 await 的特点,它们的优点和缺点分别是什么?await 原理是什么?
    • 数组哪些方法会改变自身
    • for-of与for-in的区别
    • == 和 === 有什么区别
    • ES6面试问题
    • 事件的触发过程是怎么样的?知道什么是事件代理嘛?
    • 将任意类型转为Boolean的方案
    • instanceof能正确判断对象的原因是什么
    • 如何判断数组
    • 如何判断变量类型是对象
    • 为什么要使用模块化?有哪几种方式可以实现模块化,各有什么特点?
    • null是对象吗
    • 为什么0.1+0.2!=0.3
    • 对象类型和原始类型的不同之处
    • 函数参数是对象会发生什么问题
    • window.onload与document.ready执行顺序
    • 原始类型有哪些
    • Promise 的特点是什么,分别有什么优缺点?什么是 Promise 链?Promise 构造函数执行和 then 函数执行有什么区别?
    • 如何正确判断 this?箭头函数的 this 是什么?
    • typeof能否正常判断类型
    • V8 下的垃圾回收机制是怎么样的?

V8下的垃圾回收机制是怎么样的?

vuePress-theme-reco 粥里有勺糖    2018 - 2023

V8下的垃圾回收机制是怎么样的?

粥里有勺糖 2020-04-14 面试javascript

# V8 下的垃圾回收机制是怎么样的?

垃圾回收会暂停JS运行,如果内存过大会导致垃圾回收时间变长,从而导致JS暂停时间变长

V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制。V8 将内存(堆)分为两部分:

  • 新生代
    • 64:32MB
    • 32:16MB
  • 老生代
    • 64:1400MB
    • 32:700MB

# 新生代算法

新生代中的对象一般存活时间较短

在新生代空间中,内存空间分为两部分,分别为 From 空间和 To 空间。在这两个空间中,必定有一个空间是使用的,另一个空间是空闲的。新分配的对象会被放入 From 空间中,当 From 空间被占满时,新生代 GC 就会启动了。算法会检查 From 空间中存活的对象并复制到 To 空间中,如果有失活的对象就会销毁。当复制完成后将 From 空间和 To 空间互换,这样 GC 就结束了。

# 老生代算法

老生代中的对象一般存活时间较长且数量也多,使用了两个算法,分别是标记清除算法和标记压缩(整理)算法。

  • 新生代中的对象如果经历过一次 Scavenge 算法,会将对象从新生代空间移到老生代空间中。
  • 新生代空间中的To 空间的对象占比大小超过 25 %。在这种情况下,为了不影响到内存分配,会将对象从新生代空间移到老生代空间中。

优先使用标记清除算法

  • 某一个空间没有分块的时候
  • 空间中被对象超过一定限制
  • 空间不能保证新生代中的对象移动到老生代中

标记整理

  • 空间不足以分配新生代晋升对象时,才会触发标记整理
  • 解决标记清除带来的内存碎片的问题,在标记清除的基础上进行修改
  • 将活着的对象向内存区的一端移动,移动完后清理边界外的内存
Edit this page (opens new window)
Last Updated: 2022/5/15 12:46:34