V8 堆内存

2019-06-24  本文已影响0人  LeonLi_9ea5

一张图看懂 V8 堆内存

V8_heap.png

要点

  1. V8 中大部分对象都是直接在堆上创建的

  2. V8 将堆划分出几个不同的空间,概括为两大类: 新生代和老生代

    • 新生代的大小约为 1~20MB

    • 新生代中的对象频繁诞生和死亡

    • 新生代采用 Scavenge 算法回收,老生代中采用 Mark-Sweep-Compact 回收

  3. 所有的空间都分页,页的大小通常为 1MB ,页在 V8 和操作系统之间的转移由 Memory Allocator 管理

    • 新生代的内存页是连接的

    • 老生代的内存页是分散的,以链表形式串联

  4. 新生代分为两个 semispace,每次只使用其中之一,在 GC (Garbage Collection)时从根对象开始做 BFS(Breadth-First-Search),将存活的对象转移到另一半中,存活 2 次以上的晋升至老生代 (old space),随后另一半空间释放。

  5. 除堆上的内存外,V8 还允许用户自行管理对象的内存,如 Nodejs 中的 Buffer。这些外部内存由外部代码维护并通过 API 上报大小给 V8,在 GC 时会被 V8 跳过。当然也可以向 V8 注册 GC 回调来回收这些内存。

上一篇下一篇

猜你喜欢

热点阅读