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

聊聊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热精品久久只有精品30| 国产精品亚洲片在线观看不卡| 精品久久久久久无码中文野结衣 | 日韩在线一区高清在线| 国产精品第一页爽爽影院| 中文字幕精品三区无码亚洲| 7m精品福利视频导航| 无码国内精品人妻少妇| 久久精品国产一区二区三区日韩| 久久精品无码一区二区日韩AV| 日韩AV无码精品一二三区| 亚洲国产精品日韩| 日韩毛片在线免费观看| 国产精品爽爽V在线观看无码| 内射精品无码中文字幕| 国产精品自在拍在线拍| 国产精品成人免费福利| 久久99精品久久久大学生| 91精品视频在线免费观看| 全球AV集中精品导航福利| 久久久久亚洲精品成人网小说| 国产精品水嫩水嫩| 国产精品色内内在线播放| 久草视频这里只有精品| 国产成人精品AA毛片| 亚洲av永久无码精品秋霞电影影院| 国内精品一级毛片免费看| 国产精品原创巨作av女教师| 亚洲精品午夜无码电影网| 国产伦精品免编号公布| 久久精品视频免费| 国产精品久久久亚洲| 久久老子午夜精品无码怎么打| 久久精品中文字幕首页| 午夜精品久久久久久毛片| 亚洲一二成人精品区| 99久久人妻精品免费二区| 99re6在线视频精品免费下载| 99j久久精品久久久久久| 久久精品人成免费| 精品久久久久久久久午夜福利|