【8.13】nodejs 原理學習 - 內存控制(1) - V8 的內存限制和緣由

這是我參與8月更文挑戰的第12天,活動詳情查看:8月更文挑戰前端

這篇文章是對 深刻淺出 nodejs 這本書的第五章 - 內存控制的學習筆記和練習,這是這個系列的第一篇文章,歡迎你們點贊和評論~node

總述

在前端開發中,因爲 V8 的垃圾回收機制,咱們基本上不用擔憂開發過程當中內存泄漏的問題,可是在性能敏感的服務端開發中,咱們須要關注這個問題編程

咱們發現,在 nodejs 中使用內存時會有必定的限制,只能使用部份內存(64位系統下約爲1.4 GB,32位系統下約爲0.7 GB),在這樣的限制下,咱們不能在內存中操做大文件對象,好比不能把一個2 GB大小的文件讀入內存中進行字符串處理,即便機器的物理內存有32 GB。在 nodejs 單進程的狀況下,機器的內存無法獲得充分的利用瀏覽器

這個問題的緣由主要是 nodejs 基於 V8 構建,V8 的內存分配機制。雖然在平時開發過程當中,觸達這個界限的時候比較少,可是若是不當心觸發了,會致使進程的退出。markdown

因此,下面會從幾個方面,一塊兒看看 V8 爲何會有這樣的內存限制,知道緣由以後,能夠更好的避免這個問題:app

V8 的對象分配

咱們知道,在 V8 中全部對象都是存儲在堆中,經過堆進行內存分配的,咱們能夠經過 nodejs 的 API 查看目前的內存使用狀況post

screenshot-20210813-132015.png

那麼 V8 爲何要作這樣的內存限制呢?性能

從表層緣由上說,是由於 V8 最初是爲瀏覽器設計的,瀏覽器環境下,這個內存限制綽綽有餘了學習

從深層緣由上看,是由於 V8 垃圾回收機制的限制,按照官方的說法來講,以回收 1.5 GB 堆內存爲例,V8 作一次小的垃圾回收須要 50ms 以上,作一次非增量的垃圾回收甚至須要 1s 以上。而這些垃圾回收的時間,是 JavaScript 單線程暫停執行的時間,若是垃圾回收的時間過長,應用的響應速度和性能都會直線降低,因此限制內存使用是一個比較好的選擇。ui

這個限制也是能夠打開的,在 V8 啓動時,能夠有下面兩個方式調整內存的大小

node --max-old-space-size=1700 test.js // 單位爲MB
node --max-new-space-size=1024 test.js // 單位爲KB
複製代碼

以上是 V8 的內存限制和緣由,這個系列下一篇文章,將會深刻分析 V8 在垃圾回收方面的策略,讓咱們在內存限制下更好的編程~

相關文章
相關標籤/搜索