《深入浅出 Node.js》阅读随笔
V8 引擎下的 Javascript 在运行时,存在两部分内存空间,分别是新生代和老生代,针对不同生代有着不同的垃圾回收算法。
- 新生代
新生代的内存空间占用比较少,效率很高,使用 Scavenge 算法来回收内存。大致过程是开辟两个空间,一个叫 From ,是当前使用空间,另一个叫 To,是闲置空间。当垃圾回收时,会在 From 中检查存活对象,还存活的会复制到 To 空间,不存活的会被干掉,完成回收以后,From 和 To 角色互换。如果一个对象能够在 From -> To -> From 的过程中存活多次,那么它就会被转移到老生代空内存间空中。 - 老生代
老生代的内存空间占用比较大,64 位系统大概是 1.4 GB,32 位系统大概是 0.7GB。它的效率相较新生代来说要更低一些。垃圾回收算法是 Mark-Sweep 和 Mark-Compact,它俩需要相互配合。Mark-Sweep 的大致过程是:先标记存活对象,在回收的时候再清理掉未标记项。但在此过程中会产生内存碎片,也就是内存的不连续。此时需要使用 Mark-Compact 算法来将分散的内存连接起来。
注意:作用域释放的时候,内存会被自动回收;但是有两种情况作用域是不会释放的:闭包和全局变量。此时需要手动回收一下内存,否则会导致内存溢出。
网友评论