V8 中的垃圾收集(GC),圖文指南

原文標題:Garbage collection in V8, an illustrated guide

原文鏈接:https://medium.com/@_lrlna/ga...

譯者:@justjavac

本指南與我迄今為止所寫的其他指南都不同,我在裡面添加了一些草圖。我用草圖描繪了垃圾收集(GC)的整個概念以及它是如何在 javascript 中被處理的,更確切地說是在運行 javascript 的引擎中。順便提一下,這個指南是面向初學者的,不包括 V8 內存管理的各個方面以及 V8 的內部原理。我添加了一些資源,可以幫助你更深入地了解。本指南重點介紹?javascript?,對於某些語言而言,垃圾收集是完全不一樣的,比如 C 語言.

好的,我們開始吧。

什麼是v8?

V8,是一個 JavaScript 的運行時引擎,不要與你最喜愛的番茄汁??混淆了,它負責編譯並執行你精美的javascript。V8 帶有分代垃圾收集器,我將在後文解釋。它與 Chrome 一起,而 SpiderMonkey 是 Mozilla 的引擎 Chakra 是微軟的。基本上當運行 javascript 時,您需要一個引擎來處理它,而且 V8 是您的選擇之一,無論是在瀏覽器還是在 node.js 環境中。(P.S. V8 是? 開源的 ?。)

什麼是垃圾收集?

垃圾收集的重點是通過使用特定的程序來管理內存的使用。諸如 C 之類的語言通常可以直接操作程序中的內存,並在程序的上下文中分配和釋放對象。另一方面,ECMAScript 缺少訪問內存管理的特定介面(是的,這意味著沒有API)。這基本上意味著程序中的所有內存管理許可權都被轉移到了 V8。

由於我們無法訪問無限量的內存,因此垃圾收集器的工作是通過內存中分配的對象來確定它們是否死亡或是活動。那些活著的對象會留在內存中,那些死亡的對象被刪除,內存被分配回堆。

什麼是堆?堆是非結構化區域,堆中的對象佔用分配的內存。這種分配是動態的,因為對象的大小/壽命/數量是未知的,所以需要在運行時分配和釋放。

如果我們看一下並發模型,堆直接與調用棧一起工作,因為堆棧中的對象需要進行內存分配。它看起來像這樣:

Dead or alive?

如何檢查對象的生死,是通過客戶機或者程序代碼是否可以到達此對象。您可以想到的最容易達到的對象可能是根範圍中定義的對象。

一些 C++ 綁定(或客戶端上的 Web API)也是根的一部分,因此您可以通過例如 setInterval 直接訪問。

可達性(Reachability)還可以這麼理解:另一個對象或根是否可以獲得它,如果可以的話,該對象所需的內存被保留。

那麼我們怎麼可以做到垃圾收集呢?(告訴我!告訴我!)

創建新對象或新的「指針」時,V8 會在堆中分配內存。(javascript 沒有真正的指針,所以指針在技術上只是複製對原始對象的引用)。堆中的不同類型的對象會佔用不同的空間,它將被組織成如下:

為了垃圾回收的目的,V8 將堆分為兩部分:新生區和老生區。當您執行需要 V8 分配內存的操作時,V8 將在新生區中分配空間。當你繼續添加到堆,你最終會耗盡內存,所以 V8 將不得不運行一個 GC 來清理。新創建的對象被分配得很快,並且當對象死亡時被清理(更短和更快的收集)。一旦對象「生存」了一些(確切的說是2個周期)回收掃描周期時,它們被提升到老生區,在一個單獨的循環中收集垃圾。

較舊的對象是倖存多於一個垃圾收集掃描的對象,這意味著它們仍然被其他對象引用,並且仍然需要佔用該內存。他們通常不引用較年輕的對象,只是引用較舊的對象。大周期進行的並不頻繁。一次大周期通常是在移動足夠多的對象至老生區後才會發生。

?? sources.js

  • 內存管理; 我喜歡閱讀 glossary 章節,你會發現很多 GC 的概念.
  • this is a really good and v detailed repo on v8』s perf.
  • 您可以查看 v8 repo 的 wiki,了解更多內部信息,以及如何使用 v8 調試項目
  • on frame rates from firefox dev tools
  • 另一個很好的指南 V8 && garbage collection

This guide is crossposted from lrlna』s sketchin guide on github ? ??.


推薦閱讀:

為什麼「GC標記-清除演算法」與「寫時複製技術(copy-on-write)」不兼容?
JVM full GC的奇怪現象,求解惑?
CMS GC發生concurrent mode failure時,為什麼使用單線程的full GC?
一個人基於OpenJDK實現GC的concurrent compact部分,以減少GC停頓,困難嗎?
能否提供一個和 VM 獨立的 GC 庫?

TAG:V8 | GC垃圾回收计算机科学 |