亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

Node.js 的 GC 機制詳解

2024-05-06 16:51:43
字體:
來源:轉載
供稿:網友

V8 的內存限制

在一般的后端開發語言中,在基本的內存使用上沒有什么限制,然而在 Node 中通過 JavaScript 使用內存時就會發現只能使用部分內存(64位系統下約為1.4GB,32位系統下約為0.7GB)。在這樣的限制下,將會導致 Node 無法直接操作大內存對象。

造成這個問題的主要原因在于 Node 的 JavaScript 執行引擎 V8。

在 V8 中,所有的 JavaScript 對象都是通過堆來進行分配的。Node 提供了 V8 中內存的使用量查看方法 process.memoryUsage()。

Node.js,GC機制

  • heapTotal 已申請到的堆內存
  • heapUsed 當前使用的堆內存

為什么 V8 要限制堆的大?。?/p>

1.V8 為瀏覽器而設計,不太可能遇到用大量內存的場景

2.V8 的垃圾回收機制的限制。(按官方的說法,以1.5GB的垃圾回收堆內存為例,V8做一次小的垃圾回收需要50ms以上,做一次非增量式的垃圾回收需要1s以上)

V8提供了選項讓我們可以控制使用內存的大小

  • node --max-old-space-size=1700 test.js 設置老生代內存空間最大值,單位為MB
  • node --max-new-space-size=1024 test.js 設置新生代內存空間最大值,單位為KB

比較遺憾的是,這兩個最大值需要在啟動時執行。這意味著 V8 使用的內存沒辦法根據使用的情況自動擴充,當內存分配過程中超過極限值時,就會引起進程出錯。

V8 的垃圾回收機制

V8 的垃圾回收策略主要基于分代式垃圾回收機制。在 V8 中,主要將內存分為新生代和老生代兩代。新生代中的對象為存活時間較短的對象,老生代中的對象為存活時間較長或常駐內存的對象。

Node.js,GC機制

V8 堆的整體大小就是新生代的內存空間加上老生代的內存空間

Scavenge 算法

在分代的基礎上,新生代中的對象主要通過 Scavenge 算法進行垃圾回收。在 Scavenge 的具體實現中,主要采用了 Cheney 算法。

Cheney 算法是一種采用復制的方式實現的垃圾回收算法。它將堆內存一分為二,每一部分空間成為 semispace。在這兩個 semispace 空間中,只有一個處于使用中,另一個處于閑置中。處于使用中的 semispace 空間成為 From 空間,處于閑置狀態的空間成為 To 空間。當我們分配對象時,先是在 From 空間中進行分配。當開始進行垃圾回收時,會檢查 From 空間中的存活對象,這些存活對象將被復制到 To 空間中,而非存活對象占用的空間將被釋放。完成復制后, From 空間和 To 空間的角色發生對換。

Scavenge 的缺點是只能使用堆內存的一半,但 Scavenge 由于只復制存活的對象,并且對于生命周期短的場景存活對象只占少部分,所以它在時間效率上表現優異。Scavenge 是典型的犧牲空間換取時間的算法,無法大規模地應用到所有的垃圾回收中,但非常適合應用在新生代中。

Node.js,GC機制

晉升

對象從新生代中移動到老生代中的過程稱為晉升。

From 空間中的存活對象在復制到 To 空間之前需要進行檢查,在一定條件下,需要將存活周期長的對象移動到老生代中,也就是完成對象的晉升。

晉升條件主要有兩個:

1.對象是否經歷過一次 Scavenge 回收

2.To 空間已經使用超過 25%

設置 25% 這個限制值得原因是當這次 Scavenge 回收完成后,這個 To 空間將變成 From 空間,接下來的內存分配將在這個空間中進行,如果占比過高,會影響后續的內存分配。

Mark-Sweep & Mark-Compact

V8 在老生代中主要采用了 Mark-Sweep 和 Mark-Compact 相結合的方式進行垃圾回收。

Mark-Sweep 是標記清除的意思,它分為兩個階段,標記和清除。Mark-Sweep 在標記階段遍歷堆中的所有對象,并標記活著的對象,在隨后的清除階段中,只清除未被標記的對象。

Node.js,GC機制

Mark-Sweep 最大的問題是在進行一次標記清除回收后,內存空間會出現不連續的狀態。這種內存碎片會對后續的內存分配造成問題,因為很可能出現需要分配一個大對象的情況,這時所有的碎片空間都無法完成此次分配,就會提前觸發垃圾回收,而這次回收是不必要的。

為了解決 Mark-Sweep 的內存碎片問題,Mark-Compact 被提出來。Mark-Compact是標記整理的意思,是在 Mark-Sweep 的基礎上演進而來的。它們的差別在于對象在標記為死亡后,在整理過程中,將活著的對象往一端移動,移動完成后,直接清理掉邊界外的內存。

Node.js,GC機制

下表為3種主要垃圾回收算法的簡單比較

Node.js,GC機制

從表中可以看出,在 Mark-Sweep 和 Mark-Compact 之間,由于 Mark-Compact 需要移動對象,所以它的執行速度不可能很快,所以在取舍上,V8 主要使用 Mark-Sweep,在空間不足以從新生代中晉升過來的對象進行分配時才使用 Mark-Compact 。

Incremental Marking

為了避免出現 JavaScript 應用邏輯與垃圾回收器看到的不一致的情況,垃圾回收的3種算法都需要將應用邏輯暫停下來,這種行為稱為“全停頓” (stop-the-world)。

由于新生代配置的空間較小,存活對象較少,全停頓對新生代影響不大。但老生代通常配置的空間較大,且存活對象較多,全堆垃圾回收(full 垃圾回收)的標記、清除、整理等動作造成的停頓就會比較可怕。

為了降低全堆垃圾回收帶來的停頓時間,V8 先從標記階段入手,將原本要一口氣停頓完成的動作改成增量標記(Incremental Marking),也就是拆分為許多小“步進”,每做完一“步進”就讓JavaScript應用邏輯執行一小會兒,垃圾回收和應用邏輯交替執行直到標記階段完成。

Node.js,GC機制

V8 在經過增量標記的改進后,垃圾回收的最大停頓時間可以減少到原本的 1/6 左右。

查看GC日志

查看垃圾回收日志的方式主要是在啟動時添加 --trace_gc 參數。

小結

1.Node 的 JavaScript 執行引擎為 V8,內存使用和控制也受限于 V8。

2.V8 把內存分為新生代和老生代,分別存放存活時間較短和存活時間較長或常駐內存的對象。

3.在新生代中使用 Scavenge 算法進行垃圾回收,優點是速度快無內存碎片,缺點是占用雙倍內存空間。

4.在老生代中將 Mark-Sweep 和 Mark-Compact 兩種算法結合使用,主要使用 Mark-Sweep,優點的是無需移動對象,缺點是產生內存碎片。Mark-Compact 是對 Mark-Sweep 的補充,在空間不足以對新晉升的對象進行分配時整理內存,清除內存碎片,由于要移動對象,速度較慢。

5.V8 使用 Incremental Marking 來減少全停頓帶來的影響。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲日韩欧美视频| 亚洲va码欧洲m码| 国产精品久久久999| 欧美成年人视频| 亚洲精品视频中文字幕| 精品久久久久久久久久久久久久| 成人乱人伦精品视频在线观看| 亚洲午夜av久久乱码| 色悠久久久久综合先锋影音下载| 欧美最猛黑人xxxx黑人猛叫黄| 日韩欧美成人网| 97热精品视频官网| 日韩中文字幕在线视频播放| 欧美精品少妇videofree| 96sao精品视频在线观看| 久久久久久久久久久网站| 中文日韩在线观看| 日产精品久久久一区二区福利| 国产精品视频播放| 992tv在线成人免费观看| 久久久久久国产三级电影| 欧美精品videosex极品1| 欧美风情在线观看| 亚洲欧美国产高清va在线播| 亚洲国产欧美一区二区三区久久| 66m—66摸成人免费视频| 91精品免费视频| 亚洲男人av电影| 亚洲欧美日韩中文在线制服| 欧美色另类天堂2015| 在线播放日韩欧美| 亚洲精品aⅴ中文字幕乱码| 91av在线国产| 91精品国产高清久久久久久91| 亚洲aa在线观看| 日本成人在线视频网址| 青青草国产精品一区二区| 欧美亚洲激情在线| 色妞久久福利网| 欧美丰满老妇厨房牲生活| 亚洲性无码av在线| 红桃视频成人在线观看| 日韩黄在线观看| 最近2019年日本中文免费字幕| 亚洲天堂男人的天堂| 国模精品视频一区二区三区| 久久视频这里只有精品| 国产婷婷色综合av蜜臀av| 91手机视频在线观看| 国产精品视频午夜| 久久精品久久久久久国产 免费| 欧洲成人性视频| 97色在线观看免费视频| 日本免费久久高清视频| 国产精品亚洲欧美导航| 国产亚洲美女精品久久久| 91九色视频导航| 亚洲国产成人精品久久久国产成人一区| 欧美一级大胆视频| 96国产粉嫩美女| 成人av资源在线播放| 欧美日韩国产一区二区三区| 精品国偷自产在线| 成人欧美一区二区三区黑人孕妇| 永久免费看mv网站入口亚洲| 国产亚洲欧美日韩一区二区| 91久久精品久久国产性色也91| 成人国产精品久久久久久亚洲| 亚洲男人的天堂在线播放| 国产极品jizzhd欧美| 欧美成人精品影院| 欧美性猛交xxxx乱大交3| 97av在线视频免费播放| 日本精品久久中文字幕佐佐木| 亚洲成人精品视频| 91精品中文在线| 国产精品亚洲一区二区三区| 欧美亚洲另类激情另类| 久久久久久久爱| 少妇高潮久久77777| 欧美日韩国产激情| 精品日韩视频在线观看| 黑人巨大精品欧美一区二区三区| 亚洲国产黄色片| 国产成人亚洲综合91精品| 一区二区三区回区在观看免费视频| 91po在线观看91精品国产性色| 国产精品jizz在线观看麻豆| 播播国产欧美激情| 欧美激情精品久久久久久大尺度| 中文字幕亚洲综合久久| 国产午夜精品视频免费不卡69堂| 91亚洲国产精品| 国产精品美女999| 欧美最猛性xxxxx免费| 国产一区深夜福利| 国产精品中文字幕在线观看| 日韩精品免费视频| 国产精品日韩在线观看| 亚洲精品国产拍免费91在线| 亚洲色图18p| 色婷婷av一区二区三区在线观看| 一区二区三区视频免费在线观看| 欧美最猛性xxxx| 欧美wwwwww| 91国自产精品中文字幕亚洲| 热99精品只有里视频精品| 神马久久桃色视频| 尤物精品国产第一福利三区| 亚洲毛茸茸少妇高潮呻吟| 热久久美女精品天天吊色| 亚洲裸体xxxx| 国产精品免费久久久| 亚洲国产婷婷香蕉久久久久久| 国产精品扒开腿做| 亚洲国产欧美在线成人app| 亚洲精品资源美女情侣酒店| 亚洲аv电影天堂网| 久久久久五月天| 亚洲国产91色在线| 亚洲欧洲国产伦综合| 国产精品精品一区二区三区午夜版| 色悠久久久久综合先锋影音下载| 91九色国产视频| 成人av番号网| 亚洲永久在线观看| 亚洲精品电影久久久| 亚洲老头老太hd| 亚洲国产高潮在线观看| 欧美激情亚洲一区| 全亚洲最色的网站在线观看| 久久在线视频在线| 九九热精品视频在线播放| 亚洲第一区中文字幕| www国产精品视频| 成人黄色片网站| 深夜精品寂寞黄网站在线观看| 欧美国产日韩一区二区| 国外日韩电影在线观看| 欧美日韩一区二区精品| 亚洲欧洲在线观看| 中文字幕国产亚洲| 91av成人在线| 91亚洲国产成人精品性色| 日韩电影在线观看永久视频免费网站| 欧美精品一区二区免费| 中文字幕精品一区久久久久| 亚洲人成在线免费观看| 久久久精品免费| 高清视频欧美一级| 91九色在线视频| 97成人精品视频在线观看| 青草青草久热精品视频在线观看| 国产不卡在线观看| 国产玖玖精品视频| 这里只有精品在线播放| 国产精品久久久久久中文字| 欧美成人激情视频| 欧美精品做受xxx性少妇| 国产亚洲欧美另类中文| 国产精品爱啪在线线免费观看| 欧美一级电影在线| 中文字幕欧美亚洲| 欧美电影在线观看高清|