摘要:帶有分代垃圾收集器,我將在后文解釋。堆中的不同類型的對象會占用不同的空間,它將被組織成如下為了垃圾回收的目的,將堆分為兩部分新生區和老生區。較舊的對象是幸存多于一個垃圾收集掃描的對象,這意味著它們仍然被其他對象引用,并且仍然需要占用該內存。
原文標題: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 ? ?.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/91746.html
摘要:前端日報精選中的垃圾收集,圖文指南十個免費的前端開發工具專題之遞歸如何在鏈中共享變量基于的爬蟲框架中文譯十六進制顏色揭秘掘金掘金小書基本環境安裝小書教程中間件對閉包的一個巧妙使用簡書源碼分析掘金組件開發練習焦點圖切換前端學 2017-09-13 前端日報 精選 V8 中的垃圾收集(GC),圖文指南十個免費的web前端開發工具JavaScript專題之遞歸 · Issue #49 · m...
摘要:在數據緩沖區已超過或寫入隊列當前正忙的任何情況下,將返回。當返回值時,背壓系統啟動,它會暫停傳入的流發送任何數據,并等待消費者再次準備就緒,清空數據緩沖區后,將發出事件并恢復傳入的數據流。 流中的背壓 在數據處理過程中會出現一個叫做背壓的常見問題,它描述了數據傳輸過程中緩沖區后面數據的累積,當傳輸的接收端具有復雜的操作時,或者由于某種原因速度較慢時,來自傳入源的數據就有累積的趨勢,就像...
摘要:一前言的垃圾回收機制使用垃圾回收機制來自動管理內存。垃圾回收器只會針對新生代內存區老生代指針區以及老生代數據區進行垃圾回收。分別對新生代和老生代使用不同的垃圾回收算法來提升垃圾回收的效率。 V8 實現了準確式 GC,GC 算法采用了分代式垃圾回收機制。因此,V8 將內存(堆)分為新生代和老生代兩部分。 一、前言 V8的垃圾回收機制:JavaScript使用垃圾回收機制來自動管理內存。垃...
摘要:例如,和中的對象就是實現的對象,而對象的垃圾收集機制采用的是引用計數策略。因此,即使中的引擎使用標記清除策略實現,但是訪問的對象依然是基于引用計數策略的。垃圾回收器從不移動大對象。 Js GC原理: 找出那些不再繼續使用的變量,然后釋放其所占用的內存,垃圾回收器會按照固定的時間間隔周期性地執行這一操作 Js GC 策略: 標記清除法 引用計數 JavaScript 內存分配: 在定...
摘要:的內存限制和垃圾回收機制內存限制內存限制一般的后端語言開發中,在基本的內存使用是沒有限制的。的內存分代目前沒有一種垃圾自動回收算法適用于所有場景,所以的內部采用的其實是兩種垃圾回收算法。 前言 從前端思維轉變到后端, 有一個很重要的點就是內存管理。以前寫前端因為只是在瀏覽器上運行, 所以對于內存管理一般不怎么需要上心, 但是在服務器端, 則需要斤斤計較內存。 V8的內存限制和垃圾回收機...
閱讀 2679·2023-04-25 20:28
閱讀 1849·2021-11-22 09:34
閱讀 3687·2021-09-26 10:20
閱讀 1834·2021-09-22 16:05
閱讀 3085·2021-09-09 09:32
閱讀 2502·2021-08-31 09:40
閱讀 2099·2019-08-30 13:56
閱讀 3320·2019-08-29 17:01