Skip to content

v8内存分析相关:问题 #20

@xwcoder

Description

@xwcoder

[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开发者工具加载分析快照文件。
B06644E8-9610-4423-97CD-E21EAA4DA0C4.png

C4B5BC8B-DF57-4E64-8A8F-30E49F67562B.png

对于不熟悉相关概念和原理的同学可能很容易产生很多疑问:

  • Distance, Shallow Size, Retained Size, Retainers代表什么?
  • Object的属性map是什么?
  • 除了程序中添加的属性,profile2要比profile1多了属性elementsproperties,为什么?它们分别是什么?
  • 空对象profile1和非空对象profile2Shallow Size为什么是一样的?为什么都是56字节?

这里尝试通过一组文章解释清楚这些问题,并补充相关知识。

  • 这组内容大部分整理自英文资料和演讲,所以除了有准确的、已经达成共识的对应中文名词, 其他相关术语、名词不做翻译,保留使用英文。

链接

// TODO

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions