Node.js的內(nèi)存控制

內(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)存的大小限制
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容