node內(nèi)存管理問題
在瀏覽器中,V8引擎實(shí)例的生命周期不會(huì)很長(zhǎng)(因?yàn)槲覀兪褂猛昃W(wǎng)站就會(huì)把網(wǎng)站關(guān)閉),而且運(yùn)行在用戶的機(jī)器上。如果不幸發(fā)生內(nèi)存泄露等問題,僅僅會(huì)影響到一個(gè)終端用戶。且無論這個(gè)V8實(shí)例占用了多少內(nèi)存,最終在關(guān)閉頁(yè)面時(shí)內(nèi)存都會(huì)被釋放,幾乎沒有太多管理的必要(當(dāng)然并不代表一些大型Web應(yīng)用不需要管理內(nèi)存)。但如果使用Node作為服務(wù)器,就需要關(guān)注內(nèi)存問題了,一旦內(nèi)存發(fā)生泄漏,久而久之整個(gè)服務(wù)將會(huì)癱瘓(服務(wù)器不會(huì)頻繁的重啟)。
漲知識(shí)之V8內(nèi)存限制
Node與其他語(yǔ)言不同的一個(gè)地方,就是其限制了JavaScript所能使用的內(nèi)存(64位為1.4GB,32位為0.7GB),這也就意味著將無法直接操作一些大內(nèi)存對(duì)象。這很令人匪夷所思,因?yàn)楹苌儆衅渌Z(yǔ)言會(huì)限制內(nèi)存的使用。
V8之所以限制了內(nèi)存的大小,表面上的原因是V8最初是作為瀏覽器的JavaScript引擎而設(shè)計(jì),不太可能遇到大量?jī)?nèi)存的場(chǎng)景,而深層次的原因則是由于V8的垃圾回收機(jī)制的限制。由于V8需要保證JavaScript應(yīng)用邏輯與垃圾回收器所看到的不一樣,V8在執(zhí)行垃圾回收時(shí)會(huì)阻塞JavaScript應(yīng)用邏輯,直到垃圾回收結(jié)束再重新執(zhí)行JavaScript應(yīng)用邏輯,這種行為被稱為“全停頓”(stop-the-world)。若V8的堆內(nèi)存為1.5GB,V8做一次小的垃圾回收需要50ms以上,做一次非增量式的垃圾回收甚至要1秒以上。這樣瀏覽器將在1s內(nèi)失去對(duì)用戶的響應(yīng),造成假死現(xiàn)象。如果有動(dòng)畫效果的話,動(dòng)畫的展現(xiàn)也將顯著受到影響。