-
Notifications
You must be signed in to change notification settings - Fork 4
Open
Description
这篇内容解释前一篇v8内存分析相关:问题中提到的Distance
, Shallow Size
, Retained Size
, Retainers
等相关概念。
GC roots
GC roots的概念来自垃圾回收算法。GC roots是用来进行垃圾回收的特殊对象。当进行垃圾回收时,从GC roots开始进行遍历,那些不是GC roots并且不能被访问到的对象就可以被回收。
在内存中有对象也有原始数据类型,对象之间有相互引用,对象中也可能会有原始类型。可以把内存想象成图结构。
(内存图)
上图中,节点9和10就可以被gc回收,因为从root已经访问不到这两个节点。
可以作为GC roots的对象有很多,比如window
(浏览器)、global
(Node.js)、各种内建对象、程序栈中的变量等。
Distance
GC roots到当前对象的最少引用数量。
对象本身会占用一部分内存,用来保存对象的一些基本信息和直接值等;同时对象还可以保持对其他对象的直接引用和间接引用,从而间接的占用内存。
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):用属性名标记。如图1
Retainers
中的profile2
。
参考链接
Metadata
Metadata
Assignees
Labels
No labels