node內存管理問題
在瀏覽器中默刚,V8引擎實例的生命周期不會很長(因為我們使用完網(wǎng)站就會把網(wǎng)站關閉)媚创,而且運行在用戶的機器上丹允。如果不幸發(fā)生內存泄露等問題蹄殃,僅僅會影響到一個終端用戶携茂。且無論這個V8實例占用了多少內存,最終在關閉頁面時內存都會被釋放诅岩,幾乎沒有太多管理的必要(當然并不代表一些大型Web應用不需要管理內存)讳苦。但如果使用Node作為服務器,就需要關注內存問題了吩谦,一旦內存發(fā)生泄漏鸳谜,久而久之整個服務將會癱瘓(服務器不會頻繁的重啟)。
漲知識之V8內存限制
Node與其他語言不同的一個地方式廷,就是其限制了JavaScript所能使用的內存(64位為1.4GB咐扭,32位為0.7GB),這也就意味著將無法直接操作一些大內存對象滑废。這很令人匪夷所思草描,因為很少有其他語言會限制內存的使用。
V8之所以限制了內存的大小策严,表面上的原因是V8最初是作為瀏覽器的JavaScript引擎而設計穗慕,不太可能遇到大量內存的場景,而深層次的原因則是由于V8的垃圾回收機制的限制妻导。由于V8需要保證JavaScript應用邏輯與垃圾回收器所看到的不一樣逛绵,V8在執(zhí)行垃圾回收時會阻塞JavaScript應用邏輯,直到垃圾回收結束再重新執(zhí)行JavaScript應用邏輯倔韭,這種行為被稱為“全停頓”(stop-the-world)术浪。若V8的堆內存為1.5GB,V8做一次小的垃圾回收需要50ms以上寿酌,做一次非增量式的垃圾回收甚至要1秒以上胰苏。這樣瀏覽器將在1s內失去對用戶的響應,造成假死現(xiàn)象醇疼。如果有動畫效果的話硕并,動畫的展現(xiàn)也將顯著受到影響法焰。