creamidea / creamidea.github.com

冰糖火箭筒&&蜂蜜甜甜圈
https://creamidea.github.io/
4 stars 4 forks source link

JavaScript 内存相关 #36

Open creamidea opened 2 years ago

creamidea commented 2 years ago

浏览器内存泄漏案例

https://github.com/zhansingsong/js-leakage-patterns

NodeJS 内存 GC (V8 GC)

分代回收

新生代中的对象主要通过 Scavenge 算法进行垃圾回收。在 Scavenge 的具体实现中,主要采用了 Cheney 算法。 晋升条件主要有两个:

老生代使用了标记-清除算法 (Mark-Sweep)进行垃圾回收,并使用标记-压缩算法 (Mark-Compact)整理内存碎片,提高内存的利用率

因为上述三种方式都是「全停顿」,所以 V8 引入增量标记、惰性清理、并发标记。

Mark-Sweep

白灰黑 黑是活跃内存 灰是扫描过程中,相邻节点,等待后续处理 白是可以释放的内存

Mark-Compact

释放原理

可达性分析,GC ROOTS,深度优先遍历

写屏障

记录老生区指向新生区的情况

Accurate GC

SMI, small integer V8 预留所有的字(word,32位机器是 4 字节,64 位机器是8字节)的最后一位用于标记(tag)这个字中的内容的类型,1 表示指针,0 表示整数,这样给定一个内存中的字,它能通过查看最后一位快速地判断它包含的指针还是整数,并且可以将整数直接存储在字中,无需先通过一个指针间接引用过来,节省空间。

creamidea commented 2 years ago