在 Chrome(V8) 中 Symbol() 、Object.create(null) 和 {} 的內存占用分別...
使用 Chrome Dev Tools 很容易查看內存占用。
代碼:
function Holder() {}
var holder = new Holder()
holder.s = Symbol("s")
holder.n = Object.create(null)
holder.o = {}
如果你不喜歡自己敲,我在 GitHub 上新建了一個 repo:justjavac/v8-javascript-memory
分析步驟:
使用 Chrome 瀏覽器訪問?https://justjavac.com/v8-javascript-memory/
打開 Dev Tools,如圖:
v8 chrome 內存占用選擇 Memory 標簽頁
點擊 take heap snapsshot
在過濾框中輸入?
hol?快速過濾出 holder
Shallow Size:對象自身占用內存的大小,不包括它引用的對象。JavaScript 對象會將一些內存用于自身的說明和保存中間值。通常,只有數組和字符串會有明顯的淺層大小。
Retained Size:這是將對象本身連同其無法從?GC root?到達的相關對象一起刪除后釋放的內存大小。
單位是字節(jié)(Byte)。
從截圖中可以看到
Symbol()?的內存占用是 16。Object.create(null)?自身占用 12,總占用 88。{}?自身占用 28,總占用 28。
繼續(xù)展開你會看到其他信息:
chrome dev tools__proto__?是原型鏈。map?就是很多文章都在介紹的 V8 對象的黑魔法 Hidden Class。
使用 V8 進行調試
V8 的?%DebugPrint()?函數可以打印出對象的調試信息。這需要手動使用?--is_debug=true?參數來編譯 V8。
代碼:
let o = {};
%DebugPrint(o);運行:d8 --allow_natives_syntax heap.js
輸出:
DebugPrint: 0x2604080c60e9: [JS_OBJECT_TYPE]
- map: 0x2604082802d9 注:雖然 node 和 deno 都支持 V8 的?--allow_natives_syntax參數,但是如果你使用 node 或者 deno 運行,只能得到一行類似?0x053bedbc1399 的輸出。如果想得到詳細的輸出,必須手動編譯,并且在編譯過程中增加?--is_debug=true?參數。
相關閱讀
