標籤:
海量請求+長時間運行 -> 記憶體控制 -> 一切資源高效迴圈利用
1. V8的記憶體回收機制與記憶體限制
在Node中通過JavaScript使用記憶體時,只能使用部分記憶體(64位系統下約1.4GB,32位系統下約為0.7GB)。
在V8中,所有的JavaScript對象都是通過堆來進行分配的,當申請的堆空閑記憶體不夠分配新的對象,將繼續申請堆記憶體,直到堆得大小超過V8的限制為止。
為什麼V8要限制堆得大小?
-> (1)V8最初為瀏覽器設計,不太可能遇到用大量記憶體的情境。
-> (2)V8的記憶體回收機制限制。(1.5GB的記憶體回收堆記憶體,需要大約50毫秒以上,這使得應用效能和響應能力會直線下降)
突破V8限制:
-> $node --max-old-space-size = 1700 (單位MB) or
-> $node --max-new-space-size =1024 (單位KB)
V8的記憶體回收機制 ---- 分代式記憶體回收機制
查看記憶體回收機制 ---- $node --trace_gc -e "var a = [];for (var i=0; i<1000000; i++) a.push(new Array(100));" > gc.log
2. 高效使用記憶體
(1)瞭解範圍
(2)瞭解閉包
無法立即回收的記憶體有:
->閉包
->全域變數引用
因此,要小心此類變數的無限制添加
3. 記憶體指標
--會存在一些我們認為會回收但是卻沒有被回收的對象,這會導致記憶體佔用無限增長。一旦增長達到V8記憶體限制,將會得到記憶體溢出錯誤,進而導致進程退出。
(1)查看記憶體使用量情況 -> $node >process.memoryUsage() {
{
rss (resident set size 進程的常駐記憶體部分):132852672, (除此外,記憶體其餘部分在交換區(swap)或檔案系統(filesystem)中)
heapTotal(堆中總共申請的記憶體量) :6131200,
heapUsed(目前堆中使用中的記憶體量):2757120,
}
(2)查看系統記憶體佔用
-> $node >os.totalmem() “系統的總記憶體”
-> $node >os.freemem() “系統的閑置記憶體”
(3)堆外記憶體
受V8的記憶體回收限制的主要是V8的堆記憶體。
4. 記憶體流失
造成記憶體流失的原因:
(1)緩衝
(2)隊列消費不及時
(3)範圍未釋放
5. 記憶體流失排查
使用常見工具:
(1)node-heapdump
(2)node-memwatch
6. 大記憶體應用
【讀書筆記】《深入淺出nodejs》第五章 記憶體控制