V8 堆記憶體限制
V8記憶體限制,64位的機器大約1.4GB,32位機器大約0.7GB,如果記憶體超出限制將會造成程序退出
const format = function (bytes) { return (bytes / 1024 / 1024).toFixed(2) + ' MB';};const print = function() { const memoryUsage = process.memoryUsage(); console.log(JSON.stringify({ rss: format(memoryUsage.rss), // 存在RAM中的程式碼,棧,堆的記憶體 heapTotal: format(memoryUsage.heapTotal), // 堆中總共申請的記憶體 heapUsed: format(memoryUsage.heapUsed), // 堆目前用到量, 記憶體洩漏的依據 external: format(memoryUsage.external), // v8內部c++ 佔用的記憶體 }));}
在V8中提供兩個引數僅僅在啟動階段調整記憶體限制大小新生代和老生代空間調整
--max-old-space-size=2048--max-new-space-size=2048記憶體越大越好,另一方面說V8以1.5GB的堆的記憶體進行一次小的垃圾回收大約50毫秒以上的時間,這將會導致JavaScript執行緒暫停
新生代與老生代根據物件存活週期,分新生代和老生代記憶體空間
新生代中的物件都非常小大約1-8MB,這裡垃圾回收很快新生代垃圾回收處理後存活下來的物件提升到老生代空間中新生代空間新生代垃圾回收頻繁,處理快採用scavenge演算法,一種複製演算法
新生代空間會被一分為二大小相等的兩個space,存活的物件複製出來,然後移動到另外一個空間,空間再互換位置,存活下來的提升到老生代的空間中scavenge演算法非常快,合適少量記憶體的垃圾回收,但是記憶體空間消耗大,新生代少量記憶體是可以接受。scavenge缺點重複複製存活物件使得效率低下空間浪費老生代空間老生代記憶體特點(是否經歷過scavenge回收,to space 的記憶體佔比),老生代的記憶體空間至少經歷過一次或者多次的回收,他們的存活機率會更大
採用mark-sweep(標記清除) 演算法mark-compact(標記整理) 演算法mark-sweep遍歷堆中所有物件僅標記活物件把未標記的死物件清除,這時一次標記清除已經完成
清除的物件遍佈於各個記憶體地址,產生很多的記憶體碎片mark-compact是為了解決mark-sweep演算法的記憶體碎片問題,mark-compact(標記整理演算法),其在工作的過程中把活著的物件往一端移動,這樣記憶體空間更加緊湊,移動完成直接清除邊界之外的記憶體
V8垃圾回收總結在垃圾回收的過程中採用的演算法Scavenge,mark-sweep,mark-compact,這三種垃圾回收演算法都避免不了應用程式暫停,新生代的比較快,老生代的比較慢難免會造成卡頓,所有V8還增加了增量標記的方式減少停頓時間
最新評論