在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

V8 引擎内存消耗的分析和优化

  • 2016-10-17
  • 本文字数:990 字

    阅读完需:约 3 分钟

在过去的几个月,V8 团队一直致力于降低 V8 引擎内存消耗的工作,主要内容包括推出新的 Ignition 解释器以及对 V8 解析器和编译器的改进。来自 V8 的工程师 Ulan Degenbaev、Michael Lippautz、Hannes Payer 和 Toon Verwaest 说明了这次工作的主要目标之一是根据测试基准使用特别的工具对 V8 的内存使用情况进行分析。

为了减少 V8 的内存占用,V8 团队利用 Chrome 54 版本的新特性对 V8 引擎的两个堆内存进行监控(C++ 堆和 JavaScript 堆)。Chrome 的这个新特性提供了–trace–gc-object-stats 标记,使用这个标记可以把 V8 的内存统计信息输出到控制台,然后使用 V8 heap visualizer 这个自制工具对输出的信息进行可视化,它会把两个堆的时间线视图以及对特定数据类型内存使用情况的详细分析结果展示出来。V8 团队还使用 Chrome 提供的另一个工具 Trace Event Profiling Tool 来分析内存,这个工具可以通过 about:tracing 来启动。

内存分析的结果告诉我们,垃圾回收器的延迟和内存消耗之间的平衡是决定 JavaScript 堆内存大小的因素之一。为堆保留更多的内存可以避免频繁的 GC,从而减少延迟。不过这对于低内存的设备来说会是个问题,它会导致设备崩溃或让应用程序挂起。为了达到延迟和内存消耗之间的平衡,V8 团队引入了一种新的内存缩减模式,这个模式会触发更频繁的垃圾回收,并通过更有效的压缩来减少内存碎片。从一个测试基准可以看到,新的模式总共可以把 V8 堆内存缩减 50%。引入的另一个优化措施是把 V8 的堆页面大小从 1M 减到 512K,有助于改善整体内存使用以及减少内存碎片。

V8 团队通过改进后台的解析任务来减小 C++ 的堆内存,这种改进可以让 V8 在网页加载过程中解析脚本。实际上,就像内存可视化工具所展示的那样,后台解析器会在代码编译后的很长一段时间内仍然保留着一块活跃的堆区域,而不是马上把它释放掉。另外,V8 解析器现在使用一种更有效的策略来压缩保存在语法树节点里的字段,而之前使用的是标准的 C++ 压缩。测试基准表明,峰值区域的内存缩减平均可以达到 40% 左右。

上面所描述的所有改进将出现在 Chrome 55 版本里,希望今年 12 月份可以放出。

查看英文原文: Profiling and Optimizing V8 Memory Consumption


感谢夏雪对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-10-17 19:003949
用户头像

发布了 322 篇内容, 共 160.3 次阅读, 收获喜欢 148 次。

关注

评论

发布
暂无评论
发现更多内容

范学雷的专栏《深入剖析 Java 新特性》

IT蜗壳-Tango

11月日更

Prometeus 2.31.0 新特性

耳东@Erdong

release Prometheus 11月日更

SuperEdge 和 FabEdge 联合在边缘 K8s 集群支持原生 Service 云边互访和 PodIP 直通

腾源会

开源 边缘计算 superedge

Serverless 架构模式及演进

阿里巴巴云原生

阿里云 Serverless 云原生 架构模式

干货分享:细说双 11 直播背后的压测保障技术

阿里巴巴云原生

阿里云 云原生 性能测试 PTS

Golang Gin 框架入门介绍(二)

liuzhen007

11月日更

腾讯发布 K8s 多集群管理开源项目 Clusternet

腾源会

开源 K8s 多集群管理 Clusternet

腾讯自研分布式远程Shuffle服务Firestorm正式开源

腾源会

大数据 开源 腾讯

消息队列表设计

Rabbit

你不知道的开源分布式存储系统 Alluxio 源码完整解析(下篇)

腾源会

大数据 开源

怎么清空.NET数据库连接池

喵叔

11月日更

【高并发】通过源码深度解析ThreadPoolExecutor类是如何保证线程池正确运行的

冰河

Java 并发编程 多线程 高并发 异步编程

[ CloudWeGo 微服务实践 - 08 ] Nacos 服务发现扩展 (2)

baiyutang

golang 微服务 11月日更

验证码

卢卡多多

图片验证码 11月日更

Android C++系列:JNI操作Bitmap

轻口味

c++ android jni 11月日更

一文告诉你 K8s PR (Pull Request) 怎样才能被 merge?

腾源会

k8s

多模态内容理解算法框架项目 Lichee 正式开源,为微服务开源社区贡献力量

腾源会

开源

npm必知必会点

废材壶

大前端 npm Node

我在 IBM 从事开源工作的十一年

腾源会

开源

这一次,Google 终于对 Web 自动化下手了!

星安果

chrome 自动化

Ubuntu系统下《汇编语言》环境配置

codists

汇编语言

进击的Java(七)

ES_her0

11月日更

数据库连接池Demo(1)单线程初步

Java 数据库 连接池

腾讯开源全景图再刷新:社区贡献领跑国内企业,获超过38万开发者关注

腾源会

开源 腾讯

在华为云专属月,找到开启互联网第二增长曲线的一把钥匙

脑极体

如何评价一个开源项目(一)--活跃度

腾源会

开源

面试官:讲讲雪花算法,越详细越好

秦怀杂货店

分布式 雪花算法

CNCF 沙箱再添“新将”!云原生边缘容器开源项目 SuperEdge 正式入选

腾源会

开源 容器 云原生 cncf

架构训练营 模块三 作业

dog_brother

「架构实战营」

腾讯云原生开源生态专场召开,洞察开源云原生技术发展趋势和商业化路径

腾源会

腾讯云 开源 云原生

赞!一篇博客讲解清楚 Python queue模块,作为Python爬虫预备知识,用它解决采集队列问题

梦想橡皮擦

11月日更

V8引擎内存消耗的分析和优化_JavaScript_Sergio De Simone_InfoQ精选文章