Skip to content

内存分析相关术语解释 #21

@xwcoder

Description

@xwcoder

这篇内容解释前一篇v8内存分析相关:问题中提到的Distance, Shallow Size, Retained Size, Retainers等相关概念。

GC roots

GC roots的概念来自垃圾回收算法。GC roots是用来进行垃圾回收的特殊对象。当进行垃圾回收时,从GC roots开始进行遍历,那些不是GC roots并且不能被访问到的对象就可以被回收。

在内存中有对象也有原始数据类型,对象之间有相互引用,对象中也可能会有原始类型。可以把内存想象成图结构。
(内存图)
IMAGE

上图中,节点9和10就可以被gc回收,因为从root已经访问不到这两个节点。

可以作为GC roots的对象有很多,比如window(浏览器)、global(Node.js)、各种内建对象、程序栈中的变量等。

Distance

GC roots到当前对象的最少引用数量。

图1:
IMAGE

对象本身会占用一部分内存,用来保存对象的一些基本信息和直接值等;同时对象还可以保持对其他对象的直接引用和间接引用,从而间接的占用内存。

  • Shallow Size就是对象本身占用的内存大小,不包括间接占用的内存。
  • Retained Size是对象本身占用的内存,以及由于对象被gc回收时那些它直接引用或者间接引用的也一起被回收的内存之和。

例如在前面的内存图中,如果节点2删除了对节点4的引用,那么root就访问不到节点4,所以节点4会被gc回收;同时节点4直接引用的节点6和间接引用的节点8也会被回收,所以节点4的Retained Size就是节点4、6、8和相关引用占用的内存。节点7不会被gc回收,因为它还可以通过root访问到。

如果几乎所有相同类型对象的Distance都相同,只有少数对象的Distance偏大,就要小心确认是否有OOM发生。

Retainers

图是由节点(Nodes)和边(Edges)构成的。在Chrome开发者工具中:

  • 节点(Nodes):用创建对象的构造函数标记。如图1中的Object
  • 边(Edges):用属性名标记。如图1Retainers中的profile2

参考链接

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