Open creamidea opened 2 years ago
https://github.com/zhansingsong/js-leakage-patterns
新生代中的对象主要通过 Scavenge 算法进行垃圾回收。在 Scavenge 的具体实现中,主要采用了 Cheney 算法。 晋升条件主要有两个:
老生代使用了标记-清除算法 (Mark-Sweep)进行垃圾回收,并使用标记-压缩算法 (Mark-Compact)整理内存碎片,提高内存的利用率
因为上述三种方式都是「全停顿」,所以 V8 引入增量标记、惰性清理、并发标记。
白灰黑 黑是活跃内存 灰是扫描过程中,相邻节点,等待后续处理 白是可以释放的内存
可达性分析,GC ROOTS,深度优先遍历
记录老生区指向新生区的情况
SMI, small integer V8 预留所有的字(word,32位机器是 4 字节,64 位机器是8字节)的最后一位用于标记(tag)这个字中的内容的类型,1 表示指针,0 表示整数,这样给定一个内存中的字,它能通过查看最后一位快速地判断它包含的指针还是整数,并且可以将整数直接存储在字中,无需先通过一个指针间接引用过来,节省空间。
浏览器内存泄漏案例
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 表示整数,这样给定一个内存中的字,它能通过查看最后一位快速地判断它包含的指针还是整数,并且可以将整数直接存储在字中,无需先通过一个指针间接引用过来,节省空间。