摘要:原文譯者因?yàn)槲以髡叩拇a使用的很大的內(nèi)存,所以我看了一下字符串對(duì)象數(shù)字和數(shù)組分別占用了多少內(nèi)存。位是字節(jié),但是每個(gè)數(shù)字平均占用了字節(jié)。同樣,將每個(gè)空數(shù)組的大小顯示為字節(jié),每個(gè)空對(duì)象的大小為字節(jié)。另外,并不是所有的數(shù)組在內(nèi)部都是相同的。
原文:How much memory do JavaScript arrays take up in Chrome?
譯者:justjavac
因?yàn)槲遥ㄔ髡撸┑拇a使用的很大的內(nèi)存,所以我看了一下字符串、對(duì)象、數(shù)字和數(shù)組分別占用了多少內(nèi)存。
結(jié)果如下:
我覺得這些數(shù)據(jù)最大的挑戰(zhàn)是,空數(shù)組或者空列表占用的內(nèi)存太小了。
因此我創(chuàng)建了大量空列表,而不是每次重新使用相同的空列表。
- | 總大小 MB | 每一項(xiàng)的大小 Byte |
---|---|---|
Empty Fields | 7.63 | 8.00 |
Booleans | 9.27 | 9.72 |
Numbers | 9.27 | 9.72 |
Identical Strings | 9.27 | 9.72 |
Arrays | 39.79 | 41.72 |
Empty Objects | 62.68 | 65.72 |
我不完全理解這些結(jié)果。它們依賴于 JavaScript 引擎的內(nèi)部結(jié)構(gòu)。
空字段的大小是有道理的。每一項(xiàng)正好占用 8 個(gè)字節(jié)。(整個(gè)數(shù)組實(shí)際上占用了 8,000,048 個(gè)字節(jié),因此有 48 個(gè)字節(jié)是數(shù)組本身的開銷。)
但是,數(shù)字的數(shù)組卻不符合我的期望。JavaScript 使用雙精度(64 位)浮點(diǎn)數(shù)。64 位是 8 字節(jié),但是每個(gè)數(shù)字平均占用了 9.7 字節(jié)。
同樣,Chrome 將每個(gè)空數(shù)組的大小顯示為 32 字節(jié),每個(gè)空對(duì)象的大小為 56 字節(jié)。然而,整個(gè)數(shù)組的平均大小分別為 39.8 和 62.7。
我猜測(cè)之所以造成這個(gè)差異,一部分來自于 V8 存儲(chǔ)數(shù)組項(xiàng)的元數(shù)據(jù)(例如類型信息),并且 Chrome 為數(shù)組提供的空間比實(shí)際最低要求的空間要多一些。另外,并不是所有的數(shù)組在 V8 內(nèi)部都是相同的。2011 年的這篇博文(value representation in javascript implementations)也很不錯(cuò)。
(譯注:以后有時(shí)間再寫一篇關(guān)于 V8 數(shù)組內(nèi)部存儲(chǔ)原理的文章,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 中使用內(nèi)存分析器(Profiler),可以使用此 CodePen 或從 Github 獲取代碼。
It’s also interesting to see what the table looks like with only item in each array:
- | 數(shù)組總大小 |
---|---|
Empty Field | 56 |
Boolean | 184 |
Number | 184 |
String | 216 |
Array | 216 |
Empty Object | 240 |
譯文完。
補(bǔ)充一些相關(guān)知識(shí)點(diǎn),關(guān)于 Chrome 內(nèi)存分析器(Profiler)的使用。
當(dāng)我們使用內(nèi)存分析器時(shí),要先創(chuàng)建一個(gè)純凈的環(huán)境,可以在新建標(biāo)簽頁時(shí)選擇隱身模式或者訪客模式。再高級(jí)點(diǎn)的用法就是自己新建一個(gè) Chrome 桌面快捷方式并配置相關(guān)的命令行參數(shù)。
如果你查看了之前的文章,文中提到“打開 Profiles 面板”時(shí),你可能在你的 Chrome 中找不到這個(gè)面板,因?yàn)?Profiles 已經(jīng)改名了,現(xiàn)在是 Memory 面板。
在 Memory 面板中,選擇 Take Heap Snapshot,可以制作一個(gè)堆內(nèi)存快照。Google 開發(fā)者中心有一篇非常不錯(cuò)的文章(有中文版),“如何記錄堆快照”:https://developers.google.com...
歡迎關(guān)注我的公眾號(hào),關(guān)注前端文章:
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/84061.html
摘要:五總結(jié)和應(yīng)對(duì)方案安全性分析是否安全主要由數(shù)據(jù)源決定,如果數(shù)據(jù)源不安全,只是提供了一種攻擊方法而已。方案嚴(yán)格管控?cái)?shù)據(jù)源。方案低頻使用時(shí)影響不大,不要高頻使用,建議尋找替代方案。方案了解直接調(diào)用和間接調(diào)用的區(qū)別,遇到問題時(shí)不要懵逼即可。 為什么要少用eval? eval是 js 中一個(gè)強(qiáng)大的方法。都說eval == evil等于true,這篇文章將研討eval的幾個(gè)缺點(diǎn)和使用注意事項(xiàng)。 目...
摘要:對(duì)于每個(gè)前端程序員來講都有一個(gè)終極理想,那就是搞懂引擎是如何工作的。性能經(jīng)過了兩次飛躍第次飛躍是年發(fā)布,第次則是年的。從去年底開始連載源碼分析,記錄一下自己學(xué)習(xí)源碼的點(diǎn)點(diǎn)滴滴。月星期六晚點(diǎn)和大家一起聊聊引擎前端程序員應(yīng)該懂點(diǎn)知識(shí)講堂。 對(duì)于每個(gè)前端程序員來講都有一個(gè)終極理想,那就是搞懂 javascript 引擎是如何工作的。 從我的網(wǎng)絡(luò) ID(justjavac)可以看出來,當(dāng)我開始...
摘要:前端日?qǐng)?bào)精選聽說你沒來總結(jié)個(gè)人使用過的移動(dòng)端布局方法新特性簡(jiǎn)介用寫組件坦然面對(duì)應(yīng)對(duì)前端疲勞中文深入理解筆記函數(shù)前端架構(gòu)經(jīng)驗(yàn)分享系列教程之創(chuàng)建頁面元素龍?jiān)迫珬O盗薪坛讨ㄎ豁撁嬖佚堅(jiān)迫珬5谄谂c表單驗(yàn)證技術(shù)周刊期知乎 2017-07-17 前端日?qǐng)?bào) 精選 聽說你沒來 JSConf 2017?總結(jié)個(gè)人使用過的移動(dòng)端布局方法 - Rni-L - SegmentFaultNode.js v8....
摘要:介紹瀏覽器的具有自動(dòng)垃圾回收機(jī)制,也就是說,執(zhí)行環(huán)境會(huì)負(fù)責(zé)管理代碼執(zhí)行過程中使用的內(nèi)存。中的內(nèi)存泄漏問題程序的內(nèi)存溢出后,會(huì)使某一段函數(shù)體永遠(yuǎn)失效取決于當(dāng)時(shí)的代碼運(yùn)行到哪一個(gè)函數(shù),通常表現(xiàn)為程序突然卡死或程序出現(xiàn)異常。 showImg(https://segmentfault.com/img/remote/1460000018932880?w=4400&h=3080); 1. 介紹 瀏...
摘要:摘要是如何回收內(nèi)存的深入淺出系列深入淺出第課箭頭函數(shù)中的究竟是什么鬼深入淺出第課函數(shù)是一等公民是什么意思呢深入淺出第課什么是垃圾回收算法最近垃圾回收這個(gè)話題非?;?,大家不能隨隨便便的扔垃圾了,還得先分類,這樣方便對(duì)垃圾進(jìn)行回收再利用。 摘要: JS是如何回收內(nèi)存的? 《JavaScript深入淺出》系列: JavaScript深入淺出第1課:箭頭函數(shù)中的this究竟是什么鬼? Jav...
閱讀 3079·2021-11-22 09:34
閱讀 3675·2021-08-31 09:45
閱讀 3898·2019-08-30 13:57
閱讀 1704·2019-08-29 15:11
閱讀 1708·2019-08-28 18:04
閱讀 3253·2019-08-28 17:59
閱讀 1594·2019-08-26 13:35
閱讀 2215·2019-08-26 10:12