內(nèi)存限制
Node基于V8構(gòu)建撩鹿,所以存在一定的內(nèi)存限制(64位系統(tǒng)下約為1.4GB, 32位系統(tǒng)下約為0.7GB)
可用process.memoryUsage()
查看
在啟動(dòng)node時(shí)可以通過傳遞
--max-old-space-size
或--max-new-space-size
更改拴鸵,前者對(duì)應(yīng)單位MB扒俯,用于更改老生代內(nèi)存友酱,后者對(duì)應(yīng)單位KB烤低,用于更改新生代內(nèi)存
V8的垃圾回收機(jī)制
V8中內(nèi)存分為新生代(存活時(shí)間較短的對(duì)象)和老生代(存活時(shí)間較長(zhǎng)的對(duì)象)
新生代
Scavenge算法(主要采用了Cheney算法)
- 將堆內(nèi)存一分為二兼丰,每一部分空間叫semispace绰咽,使用中的叫From,閑置的叫To
- 開始垃圾回收時(shí)地粪,先檢查From中的存活,將其復(fù)制到To琐谤,其余釋放蟆技,完成后From與To二者交換(這個(gè)交換的過程也稱翻轉(zhuǎn))
- 是一種典型的犧牲空間換取時(shí)間的算法,但是非常適合新生代這種場(chǎng)合
老生代
晉升
若一個(gè)對(duì)象經(jīng)過多次復(fù)制依然存活時(shí),會(huì)被移動(dòng)到老生代中质礼,稱為晉升
晉升的要求:(將對(duì)象從From到To時(shí)):
- 若對(duì)象經(jīng)歷過一次Scavenge回收旺聚,則復(fù)制到老生代空間里
- 若To中空間使用大于25%,則復(fù)制到老生代空間里
算法
老生代垃圾回收的算法:
- mark-sweep算法:字面上理解眶蕉,第一步砰粹,標(biāo)記;第二步造挽,清除碱璃。標(biāo)記活著的對(duì)象,只清理死亡的對(duì)象饭入。缺點(diǎn)嵌器,會(huì)存在碎片空間。
- mark-compact算法:第一步谐丢,標(biāo)記死亡對(duì)象爽航;第二步,整理乾忱,將活著的對(duì)象往一端移動(dòng)讥珍,移動(dòng)完成后,直接清理掉邊界外的內(nèi)存窄瘟。
主要使用mark-sweep:因?yàn)樗俣瓤?/p>
全停頓(stop-the-world)
在進(jìn)行垃圾回收的時(shí)候會(huì)全停頓衷佃,而在老生代中全停頓時(shí)間很久,所以有增量標(biāo)記
無法立即回收的內(nèi)存
- 全局變量
- 閉包
堆外內(nèi)存
Node中的內(nèi)存使用并非都是通過V8進(jìn)行分配的寞肖,不是通過V8分配的內(nèi)存稱為堆外內(nèi)存
- Buffer使用的是堆外內(nèi)存纲酗,沒有堆內(nèi)存的大小限制