【讀書筆記】《深入淺出nodejs》第五章 記憶體控制

來源:互聯網
上載者:User

標籤:

海量請求+長時間運行 -> 記憶體控制 -> 一切資源高效迴圈利用

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》第五章 記憶體控制

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.