一张图看懂 V8 堆内存
V8_heap.png要点
-
V8 中大部分对象都是直接在堆上创建的
-
V8 将堆划分出几个不同的空间,概括为两大类: 新生代和老生代
-
新生代的大小约为 1~20MB
-
新生代中的对象频繁诞生和死亡
-
新生代采用 Scavenge 算法回收,老生代中采用 Mark-Sweep-Compact 回收
-
-
所有的空间都分页,页的大小通常为 1MB ,页在 V8 和操作系统之间的转移由 Memory Allocator 管理
-
新生代的内存页是连接的
-
老生代的内存页是分散的,以链表形式串联
-
-
新生代分为两个 semispace,每次只使用其中之一,在 GC (Garbage Collection)时从根对象开始做 BFS(Breadth-First-Search),将存活的对象转移到另一半中,存活 2 次以上的晋升至老生代 (old space),随后另一半空间释放。
-
除堆上的内存外,V8 还允许用户自行管理对象的内存,如 Nodejs 中的 Buffer。这些外部内存由外部代码维护并通过 API 上报大小给 V8,在 GC 时会被 V8 跳过。当然也可以向 V8 注册 GC 回调来回收这些内存。
网友评论