站長資訊網
最全最豐富的資訊網站

聊聊Node.js中的 GC (垃圾回收)機制

Node 是如何做 GC (垃圾回收)的?下面本篇文章就來帶大家了解一下。

聊聊Node.js中的 GC (垃圾回收)機制

node.js極速入門課程:進入學習

GC,Garbage Collection,垃圾回收。在編程中,一般指的是內存自動回收機制,會定時將不需要用到的數據進行清除。

Node.js 底層使用了 V8 引擎。V8 是 Google 開源的一款高性能 JavaScript 引擎,使用了 C++ 進行編寫。【相關教程推薦:nodejs視頻教程】

Node.js 的內存主要分成三部分:

  • 代碼空間:存放代碼段的地方;

  • 棧:函數調用棧產生的臨時變量,為一些基本類型,比如數字、字符串、布爾值,以及對象引用(保存的是地址,不保存對象本身)。

  • 堆:存放對象等數據;

堆內存

Node.js 底層使用的是 V8,下面講解一下 V8 的內存回收機制。

首先 JS 中所有的對象都會保存在堆內存中。在創建進程的時候,會分配一個初始大小的堆內存,然后我們的對象就會放到里面。

當對象越來越多,堆內存會不夠用,此時堆內存會動態地擴大。如果到達一個最大限制(現在通常是 4GB),就會堆內存溢出的錯誤,然后終止 Node.js 進程。

新生代與老生代

V8 首先將內存分成兩部分,或者說兩個生代(generation):

  • 新生代(yong generation):保存一些存活時間較短的對象;

  • 老生代(old generation):保存存活時間長或者長駐的對象。

新生代很小,這里會存放一些存活時間很短的對象,通常它們會被頻繁地回收(比如函數的調用棧的一些臨時對象)。

新生代可通過 node --max-semi-space-size=SIZE index.js 修改新生代的大小,單位為 MB。

另外,老生代則通過 --max-old-space-size=SIZE 來設置

新生代的 Scavenge 算法

新生代使用了 Scavenge 算法,是一種基于 copy(復制)的算法。

新生代會分成兩個空間,這種空間稱為 semispace,它們為:

  • From 空間:新聲明的對象會放入這里

  • To 空間:用作搬移的空間

新聲明的對象會放入到 From 空間中,From 空間的對象緊密排布,通過指針,上一對象緊貼下一個對象,是內存連續的,不用擔心內存碎片的問題。

所謂內存碎片,指的是空間分配不均勻,產生大量小的連續空間,無法放入一個大對象。

當 From 空間快滿了,我們就會遍歷找出活躍對象,將它們 copy 到 To 空間。此時 From 空間其實就空了,然后我們將 From 和 To 互換身份。

如果一些對象被 copy 了多次,會被認為存活時間較長,將被移動到老生代中。

這種基于 copy 的算法,優點是可以很好地處理內存碎片的問題,缺點是會浪費一些空間作為搬移的空間位置,此外因為拷貝比較耗費時間,所以不適合分配太大的內存空間,

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
99热成人精品热久久669| 日韩免费一区二区三区| 精品国产sm捆绑最大网免费站 | 香蕉伊思人在线精品| 精品女同一区二区三区在线| 国产成人亚洲精品91专区高清 | 国产精品久久二区二区| 亚洲精品无码av片| 2018国产精华国产精品| 亚洲精品自拍视频| 久久精品国产亚洲av麻豆色欲| 国产精品色内内在线播放| 国内精品人妻无码久久久影院导航 | 久久精品国产亚洲7777| 国产精品 猎奇 另类视频| 全国精品一区二区在线观看| 日韩电影中文字幕在线观看| 日韩一区二区视频在线观看| 日韩亚洲Av人人夜夜澡人人爽| 日韩精品一区二区三区影院| 国产亚洲精品2021自在线| 国产精品免费视频一区| 国产精品自拍亚洲| 国产精品亚洲精品日韩动图| 国产精品无码一区二区三区免费| 精品国产三级a∨在线观看| 精品国产电影久久九九| 韩国精品一区视频在线播放 | 国产精品永久免费| 国产成人精品综合久久久| 国产成人久久久精品二区三区 | 国产AV午夜精品一区二区入口| 久久福利青草精品资源站| 久久精品国产亚洲综合色| 久久国产精品-国产精品| 亚洲高清专区日韩精品| 午夜精品美女自拍福到在线| 99久久综合精品国产| 精品一区高潮喷吹在线播放| 六月婷婷国产精品综合| 日韩精品福利片午夜免费观着|