Orinoco:年轻代垃圾回收
在V8中,JavaScript对象被分配到由V8垃圾回收器管理的堆上。在之前的博客文章中,我们已经讨论了如何减少垃圾回收暂停时间(不止一次)以及内存消耗。在这篇博客文章中,我们介绍了并行Scavenger,这是V8的主要并发和并行垃圾回收器Orinoco的最新功能之一,并讨论了设计决策以及我们实施的一些备选方法。
在V8中,JavaScript对象被分配到由V8垃圾回收器管理的堆上。在之前的博客文章中,我们已经讨论了如何减少垃圾回收暂停时间(不止一次)以及内存消耗。在这篇博客文章中,我们介绍了并行Scavenger,这是V8的主要并发和并行垃圾回收器Orinoco的最新功能之一,并讨论了设计决策以及我们实施的一些备选方法。
大约三个月前,我作为实习生加入了V8团队(Google Munich),从那时起,我一直在研究虚拟机的 去优化器 —— 这是对我来说全新的领域,但也证明了是一个有趣且具挑战性的项目。实习的第一部分重点在于提高虚拟机的安全性。第二部分则集中于性能改进,即删除用于取消链接以前被优化的函数的数据结构,而这个结构在垃圾回收时是性能瓶颈。本博客文章描述了我实习的第二部分。我将解释V8过去如何取消链接被优化的函数,我们如何对其进行更改,以及获得了哪些性能提升。
V8对其堆大小有一个硬限制。这充当了防止应用程序内存泄漏的保护措施。当应用程序达到这一硬限制时,V8会执行一系列最后的垃圾回收措施。如果垃圾回收未能释放内存,V8会停止执行并报告内存不足故障。如果没有这一硬限制,内存泄漏的应用程序可能会占用所有系统内存,从而影响其他应用程序的性能。
内存消耗是 JavaScript 虚拟机性能权衡空间中的一个重要维度。在过去的几个月中,V8 团队分析并显著减少了多个网站的内存占用,这些网站被认为是现代 Web 开发模式的代表。在这篇博客中,我们展示了分析中使用的工作负载和工具,概述了垃圾回收器的内存优化,并展示了我们如何减少 V8 的解析器及其编译器的内存消耗。
在之前的博客文章中,我们介绍了垃圾回收中断顺畅浏览体验导致的卡顿问题。在本文中,我们介绍了三种优化,这些优化为V8中的新垃圾回收器(代号为_Orinoco_)奠定了基础。Orinoco基于这样一个理念:实现一个大部分并行和并发的垃圾回收器,在没有严格代界限的情况下,可以减少垃圾回收的卡顿和内存消耗,同时提供高吞吐量。我们没有将Orinoco作为单独的垃圾回收器在标志后面实现,而是决定逐步在V8的主代码库中发布Orinoco的功能以便用户立即受益。本篇文章讨论的三个功能是并行压缩、并行记忆集处理和黑色分配。
JavaScript性能仍然是Chrome核心价值的关键部分,尤其是在提供流畅体验方面。自Chrome 41开始,V8采用了一种新技术,通过在小的、否则会被闲置的时间片段中隐藏昂贵的内存管理操作,提高了网页应用程序的响应性。因此,网页开发者可以期望更流畅的滚动效果和柔顺动画,同时由于垃圾回收减少了大量卡顿现象。