-
Notifications
You must be signed in to change notification settings - Fork 4
Open
Description
[TOC]
这篇内容的运行环境和软件版本如下:
- OS:macOS 10.14.3
- Chrome: 74.0.3729.131(正式版本) (64 位)
- Node.js: v12.0.0
问题
在进行v8堆内存快照分析时通常会用到chrome开发者工具的Memory
面板(之前的版本是Profiles面板)。
先看个简单的例子:
// memeory.js
const v8 = require('v8')
global.profile1 = {}
global.profile2 = {}
for (let i = 0; i < 10; i++) {
global.profile2[`p${i}`] = { x: 1, y: 2 }
}
global.profile2[1] = 'node.js'
v8.writeHeapSnapshot()
这段代码在global
上添加了两个对象,一个空对象profile1
, 一个非空对象profile2
。profile2上有10个key是字符串的属性p0~p9, 还有一个key是整数1的属性。
执行node memory.js
会得到一个快照文件。使用chrome开发者工具加载分析快照文件。
对于不熟悉相关概念和原理的同学可能很容易产生很多疑问:
Distance
,Shallow Size
,Retained Size
,Retainers
代表什么?- Object的属性
map
是什么? - 除了程序中添加的属性,
profile2
要比profile1
多了属性elements
、properties
,为什么?它们分别是什么? - 空对象
profile1
和非空对象profile2
的Shallow Size
为什么是一样的?为什么都是56字节?
这里尝试通过一组文章解释清楚这些问题,并补充相关知识。
- 这组内容大部分整理自英文资料和演讲,所以除了有准确的、已经达成共识的对应中文名词, 其他相关术语、名词不做翻译,保留使用英文。
链接
// TODO
Metadata
Metadata
Assignees
Labels
No labels