专栏名称: 阿里云开发者
阿里巴巴官方技术号,关于阿里的技术创新均将呈现于此
今天看啥  ›  专栏  ›  阿里云开发者

你的object可能没别人的快/小

阿里云开发者  · 公众号  · 科技公司  · 2024-11-06 08:30
    

主要观点总结

本文深入探讨了JavaScript对象在V8引擎中的内存管理和优化策略,特别是在处理大规模数据时可能出现的性能和内存问题。通过介绍V8中对象的基本结构、对象结构变化的影响以及如何避免或削弱负面影响,提供了一些有效的JS对象内存优化方法。

关键观点总结

关键观点1: JSON.parse加载大规模数据后内存飙升的原因

大规模数据下,JS对象的存储结构发生变化,由fast模式转为slow模式,导致内存飙升。

关键观点2: V8中对象的基本结构

V8中的对象最少会有三个指针,分别指向HiddenClass、Properties store和Elements store。对象内属性(in-object properties)存储在对象本身上,数量由对象的初始大小预先确定。

关键观点3: 如何避免或削弱对象结构变化带来的负面影响

尽量让对象处于快速模式,避免属性总数过多或删除属性。可以通过设置对象为函数原型、使用JSON.stringify和JSON.parse解析对象、非必要不使用Object.create(null)创建对象等方式进行优化。

关键观点4: JS对象内存优化的解决方案

介绍两种优化策略:一是迁移慢对象到fast模式下,二是使用JSON.stringify和JSON.parse解析对象。这两种方法都可以有效降低对象存储大小。


文章预览

阿里妹导读 本文深入探讨了JavaScript对象在V8引擎中的内存管理和优化策略,特别是在处理大规模数据时可能出现的性能和内存问题。 背景 开发某JS应用时使用了一个较大的数据列表,在探究性能和内存过程中,观察到了反常的数据内存变化,从而引发了本文相关内容的研究。本文绝大部分对象设计和实现细节的内容和结论来自于V8的源码阅读、以及Chrome上的JS实验,如有错误欢迎指出纠正。 引子 假设有100,000*100的数据存储在一个JSON文件中,表达形式是一个含10万个对象的数组,其中每个对象有相同的100个属性,属性名和属性值非常简单,比如{"a0":0, "a1":0,"a2":0...}。 JSON.parse加载此数据后,JS内存占用是42.6MB(所有Chrome内存汇报都已经过垃圾回收)。 此时,如果我们删除每一个元素中间的某个属性,如: arr.forEach((item) => { delete item[`a0`]; })) 删除一个 ………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览