這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)在Chrome中JavaScript數(shù)組到底占用了多少內(nèi)存,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
公司主營業(yè)務(wù):網(wǎng)站設(shè)計制作、網(wǎng)站設(shè)計、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)建站是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)建站推出加格達(dá)奇免費做網(wǎng)站回饋大家。
因為我(原作者)的代碼使用的很大的內(nèi)存,所以我看了一下字符串、對象、數(shù)字和數(shù)組分別占用了多少內(nèi)存。
結(jié)果如下:
我覺得這些數(shù)據(jù)最大的挑戰(zhàn)是,空數(shù)組或者空列表占用的內(nèi)存太小了。
因此我創(chuàng)建了大量空列表,而不是每次重新使用相同的空列表。
- | 總大小 MB | 每一項的大小 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)。
空字段的大小是有道理的。每一項正好占用 8 個字節(jié)。(整個數(shù)組實際上占用了 8,000,048 個字節(jié),因此有 48 個字節(jié)是數(shù)組本身的開銷。)
但是,數(shù)字的數(shù)組卻不符合我的期望。JavaScript 使用雙精度(64 位)浮點數(shù)。64 位是 8 字節(jié),但是每個數(shù)字平均占用了 9.7 字節(jié)。
同樣,Chrome 將每個空數(shù)組的大小顯示為 32 字節(jié),每個空對象的大小為 56 字節(jié)。然而,整個數(shù)組的平均大小分別為 39.8 和 62.7。
我猜測之所以造成這個差異,一部分來自于 V8 存儲數(shù)組項的元數(shù)據(jù)(例如類型信息),并且 Chrome 為數(shù)組提供的空間比實際最低要求的空間要多一些。另外,并不是所有的數(shù)組在 V8 內(nèi)部都是相同的。2011 年的這篇博文(value representation in javascript implementations)也很不錯。
(譯注:以后有時間再寫一篇關(guān)于 V8 數(shù)組內(nèi)部存儲原理的文章,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 |
譯文完。
補充一些相關(guān)知識點,關(guān)于 Chrome 內(nèi)存分析器(Profiler)的使用。
當(dāng)我們使用內(nèi)存分析器時,要先創(chuàng)建一個純凈的環(huán)境,可以在新建標(biāo)簽頁時選擇隱身模式或者訪客模式。再高級點的用法就是自己新建一個 Chrome 桌面快捷方式并配置相關(guān)的命令行參數(shù)。
如果你查看了之前的文章,文中提到“打開 Profiles 面板”時,你可能在你的 Chrome 中找不到這個面板,因為 Profiles 已經(jīng)改名了,現(xiàn)在是 Memory 面板。
在 Memory 面板中,選擇 Take Heap Snapshot,可以制作一個堆內(nèi)存快照。Google 開發(fā)者中心有一篇非常不錯的文章(有中文版),“如何記錄堆快照”:https://developers.google.com/web/tools/chrome-devtools/memory-problems/heap-snapshots
上述就是小編為大家分享的在Chrome中JavaScript數(shù)組到底占用了多少內(nèi)存了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。