node是基於V8引擎開發的,V8的設計是為瀏覽器設計的,所以V8的內存相對較少,當然可以通過 node --max-old-space-size=1700 (單位是MB) 或 node --max-new-space-size=1024(單位是KB)來進行設置。
V8的內存分代分為兩代,一種是新生代,主要存放對象為存活時間較短的對象,另一種是老生代,主要存放較長時或常駐內存的對象。
老生代 64位下 1.4GB 32位下 700MB
新生代 64位下 32MB 32位下 16MB
垃圾回收算法:
Scavenge算法[skavindg]
新生代主要是通過Scavenge算法進行垃圾回收,該算法主要采用了Cheney算法。
Cheney算法[切尼]
是一種采用了復制的方式實現的垃圾回收算法,它將堆內存一分為二,每一部分空間成為semispace。在這兩個semispace空間中,只有一個處於使用中,另一個處於閑置狀態。處於使用中的空間稱為FROM空間,處於閑置狀態的空間稱為TO空間,在我們分配對象時,先在FROM空間中進行分配。
垃圾回收時,先在FROM空間中查找存活的對象,將其復制到TO空間中,而非存活的對象將會被釋放,隨后對FROM和TO空間進行角色對換,如果,一個對象經過多次復制依然存活時,他將會被認為是生命周期較長的對象,這種生命周期較長的對象將會被移動到老生代中,采用新的算法進行管理,該過程稱之為晉升。
Scavenge算法是典型的浪費空間換時間的算法。
晉升后的老生代采用Mark-Sweep和Mark-Compact算法
Mark-Sweep算法:
是在標記階段遍歷堆中所有的對象,並標記活着的對象,在隨后的清除階段中,只清除沒有被標記的對象。
Scavenge算法是只復制活着的對象,而Mark-Sweep只清除死亡的對象。
但是Mark-Sweep算法存在一個重大的問題就是進行一次清理后,會造成內存碎片,使內存出現不連續的狀態。這種內存碎片會對后續的內存分配造成問題,一旦有一個大對象要分配的情況,所有的碎片空間都無法完成此次分配,就會提前出發垃圾回收,而這次垃圾回收是沒有必要的。因而為了解決Mark-Sweep內存碎片問題,Mark-Compact被提出來。
Mark-Compact算法:
是標記整理的意思,是在Mark-Sweep的基礎上演變而來的,差別在於對象在標記為死亡后,在整理的過程中,將活着的對象往一端移動,移動完成后,直接清理掉邊界外的內存,完成回收。
回收算法 | Mark-Sweep | Mark-Compact | Scavenge |
速度 | 中等 | 最慢 | 最快 |
空間開銷 | 少(有碎片) | 少(無碎片) | 雙倍空間(無碎片) |
是否移動對象 | 否 | 是 | 是 |