在 Chrome 中 JavaScript 数组究竟占用了若干内存?

原文:How much memory do JavaScript arrays take up in Chrome?
译者:justjavac

由于我(原作者)的代码运用的很大的内存,所以我看了一下字符串、对象、数字和数组离别占用了若干内存。

效果以下:

《在 Chrome 中 JavaScript 数组究竟占用了若干内存?》

我以为这些数据最大的应战是,空数组或许空列表占用的内存太小了。

因而我建立了大批空列表,而不是每次从新运用雷同的空列表。

–  总大小 MB每一项的大小 Byte
Empty Fields7.638.00
Booleans9.279.72
Numbers9.279.72
Identical Strings9.279.72
Arrays39.7941.72
Empty Objects62.6865.72

我不完全明白这些效果。它们依赖于 JavaScript 引擎的内部结构。

空字段的大小是有道理的。每一项恰好占用 8 个字节。(全部数组现实上占用了 8,000,048 个字节,因而有 48 个字节是数组自身的开支。)

然则,数字的数组却不相符我的希冀。JavaScript 运用双精度(64 位)浮点数。64 位是 8 字节,然则每一个数字均匀占用了 9.7 字节。

一样,Chrome 将每一个空数组的大小显现为 32 字节,每一个空对象的大小为 56 字节。但是,全部数组的均匀大小离别为 39.8 和 62.7。

我猜想之所以形成这个差别,一部分来自于 V8 存储数组项的元数据(比方范例信息),而且 Chrome 为数组供应的空间比现实最低请求的空间要多一些。别的,并非一切的数组在 V8 内部都是雷同的。2011 年的这篇博文(value representation in javascript implementations)也很不错。

(译注:今后有时间再写一篇关于 V8 数组内部存储道理的文章,by justjavac)

// Inheritance hierarchy:
// - Object
//   - Smi          (immediate small integer)
//   - HeapObject   (superclass for everything allocated in the heap)
//     - JSReceiver  (suitable for property access)
//       - JSObject
//         - JSArray
//         - JSArrayBuffer
//         - JSArrayBufferView
//           - JSTypedArray

假如要在 Chrome 中运用内存分析器(Profiler),能够运用此 CodePen 或从 Github 猎取代码。

《在 Chrome 中 JavaScript 数组究竟占用了若干内存?》

It’s also interesting to see what the table looks like with only item in each array:

数组总大小
Empty Field56
Boolean184
Number184
String216
Array216
Empty Object240

译文完。

补充一些相干知识点,关于 Chrome 内存分析器(Profiler)的运用。

当我们运用内存分析器时,要先建立一个纯洁的环境,能够在新建标签页时挑选隐身形式或许访客形式。再高等点的用法就是本身新建一个 Chrome 桌面快捷方式并设置相干的命令行参数。

假如你查看了之前的文章,文中提到“翻开 Profiles 面板”时,你能够在你的 Chrome 中找不到这个面板,由于 Profiles 已更名了,现在是 Memory 面板。

在 Memory 面板中,挑选 Take Heap Snapshot,能够制造一个堆内存快照。Google 开发者中间有一篇异常不错的文章(有中文版),“怎样纪录堆快照”:https://developers.google.com…

迎接关注我的民众号,关注前端文章:

《在 Chrome 中 JavaScript 数组究竟占用了若干内存?》

    原文作者:justjavac
    原文地址: https://segmentfault.com/a/1190000010210269
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞