JavaScript 进阶实战课
石川
JavaScript Patterns and Anti-Patterns 等开源项目创建者,O'Reilly 技术评审
15066 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
开篇词 (1讲)
JavaScript 进阶实战课
15
15
1.0x
00:00/00:00
登录|注册

29|性能:通过Orinoco、Jank Busters看垃圾回收

你好,我是石川。
在前两讲中,我们从多线程开发的角度了解了 JavaScript 中的性能优化。
今天,我们再来看一下 JavaScript 中内存管理相关的垃圾回收(garbage collection)机制,以及用到的性能优化的相关算法。
实际上,在 JS 语言中,垃圾回收是自动的,也就是说并不是我们在程序开发中手工处理的,但是,了解它对理解内存管理的底层逻辑还是很有帮助的。特别是结合我们前面两节课讲到的,在前端场景中,当我们的程序使用的是图形化的 WebGL+Web Worker 的多线程来处理大量的计算或渲染工作时,了解内存管理机制则是非常必要的。特别提醒一下,这节课会涉及到比较多的理论和底层知识,一定要跟紧我们的课程节奏啊。

闲置状态和分代回收

我们在上一讲说到并行和并发的时候,有讲到过,前端的性能指标中,我们通常关注的是流畅度和反应度。在理想的状态下,为了获得丝滑流畅的体验,我们需要达到 60fps,也就是每帧在 16.6ms 内渲染。在很多的情况下,浏览器都可以在 16.6ms 内完成渲染,这个时候,如果提前渲染完了,剩下的时间我们的主线程通常是闲置(idle)的状态。而 Chrome 通常会利用这个闲置的时间来做垃圾回收。通过下面的图示,我们可以更加直观地看到主线程上这些任务的执行顺序。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

JavaScript内存管理中的垃圾回收机制对于应用性能至关重要。本文介绍了分代回收的概念,将内存堆分为年轻代和老年代,并详细解释了副回收器和主回收器的工作原理。副回收器采用并行回收,通过多线程间平行完成垃圾回收工作,提高了性能。而主回收器则采用并发处理,通过标记、清除和整理的步骤来管理内存。文章深入浅出地解释了垃圾回收的底层逻辑,为读者提供了深入理解JavaScript内存管理的知识。 在主回收器中,文章介绍了并发标记和增量标记两种方法。并发标记允许标记工作在多个工作线程上同时执行,提高了处理效率。而增量标记则利用主线程空闲时间处理标记任务,通过三色标记法和写屏障来保证标记的准确性。这些方法的应用使得垃圾回收可以在不影响程序执行的情况下进行,提高了应用的流畅度。 最后,文章指出随着Web应用的复杂度不断提高,内存管理和垃圾回收将是一个持续值得关注的话题。尤其在Web3.0、元宇宙等概念的兴起以及并行、并发实现的普及下,对前端对象创建和渲染工作的复杂度提出了更高的要求。因此,对于JavaScript的垃圾回收虽然是自动的,但在编写代码时仍有一些“手工”优化内存的方法,这也是需要读者深入思考和探讨的问题。 总之,本文通过深入剖析V8引擎的垃圾回收机制,为读者提供了全面的JavaScript内存管理知识,同时也引发了对于内存优化和性能提升的思考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《JavaScript 进阶实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(1)

  • 最新
  • 精选
  • 度衡
    垃圾回收器通过可触达度来判断对象'活跃度',那些在运行时无法访问的对象即为可回收对象。因此,可以手动将不需要使用的对象变量赋值为null,从而使该对象不可访问,更快达能够可回收。
    2023-01-05归属地:北京
收起评论
显示
设置
留言
1
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部