摘要:帶有分代垃圾收集器,我將在后文解釋。堆中的不同類型的對象會占用不同的空間,它將被組織成如下為了垃圾回收的目的,將堆分為兩部分新生區(qū)和老生區(qū)。較舊的對象是幸存多于一個垃圾收集掃描的對象,這意味著它們?nèi)匀槐黄渌麑ο笠?,并且仍然需要占用該?nèi)存。
原文標(biāo)題:Garbage collection in V8, an illustrated guide
原文鏈接:https://medium.com/@_lrlna/ga...
譯者:@justjavac
本指南與我迄今為止所寫的其他指南都不同,我在里面添加了一些草圖。我用草圖描繪了垃圾收集(GC)的整個概念以及它是如何在 javascript 中被處理的,更確切地說是在運(yùn)行 javascript 的引擎中。順便提一下,這個指南是面向初學(xué)者的,不包括 V8 內(nèi)存管理的各個方面以及 V8 的內(nèi)部原理。我添加了一些資源,可以幫助你更深入地了解。本指南重點(diǎn)介紹?javascript?,對于某些語言而言,垃圾收集是完全不一樣的,比如 C 語言.
好的,我們開始吧。
什么是v8?V8,是一個 JavaScript 的運(yùn)行時引擎,不要與你最喜愛的番茄汁?混淆了,它負(fù)責(zé)編譯并執(zhí)行你精美的javascript。V8 帶有分代垃圾收集器,我將在后文解釋。它與 Chrome 一起,而 SpiderMonkey 是 Mozilla 的引擎 Chakra 是微軟的?;旧袭?dāng)運(yùn)行 javascript 時,您需要一個引擎來處理它,而且 V8 是您的選擇之一,無論是在瀏覽器還是在 node.js 環(huán)境中。(P.S. V8 是? 開源的 ?。)
什么是垃圾收集?垃圾收集的重點(diǎn)是通過使用特定的程序來管理內(nèi)存的使用。諸如 C 之類的語言通??梢灾苯硬僮鞒绦蛑械膬?nèi)存,并在程序的上下文中分配和釋放對象。另一方面,ECMAScript 缺少訪問內(nèi)存管理的特定接口(是的,這意味著沒有API)。這基本上意味著程序中的所有內(nèi)存管理權(quán)限都被轉(zhuǎn)移到了 V8。
由于我們無法訪問無限量的內(nèi)存,因此垃圾收集器的工作是通過內(nèi)存中分配的對象來確定它們是否死亡或是活動。那些活著的對象會留在內(nèi)存中,那些死亡的對象被刪除,內(nèi)存被分配回堆。
什么是堆?堆是非結(jié)構(gòu)化區(qū)域,堆中的對象占用分配的內(nèi)存。這種分配是動態(tài)的,因?yàn)閷ο蟮拇笮?壽命/數(shù)量是未知的,所以需要在運(yùn)行時分配和釋放。
如果我們看一下并發(fā)模型,堆直接與調(diào)用棧一起工作,因?yàn)槎褩V械膶ο笮枰M(jìn)行內(nèi)存分配。它看起來像這樣:
Dead or alive?如何檢查對象的生死,是通過客戶機(jī)或者程序代碼是否可以到達(dá)此對象。您可以想到的最容易達(dá)到的對象可能是根范圍中定義的對象。
一些 C++ 綁定(或客戶端上的 Web API)也是根的一部分,因此您可以通過例如 setInterval 直接訪問。
可達(dá)性(Reachability)還可以這么理解:另一個對象或根是否可以獲得它,如果可以的話,該對象所需的內(nèi)存被保留。
那么我們怎么可以做到垃圾收集呢?(告訴我!告訴我!)創(chuàng)建新對象或新的“指針”時,V8 會在堆中分配內(nèi)存。(javascript 沒有真正的指針,所以"指針"在技術(shù)上只是復(fù)制對原始對象的引用)。堆中的不同類型的對象會占用不同的空間,它將被組織成如下:
為了垃圾回收的目的,V8 將堆分為兩部分:新生區(qū)和老生區(qū)。當(dāng)您執(zhí)行需要 V8 分配內(nèi)存的操作時,V8 將在新生區(qū)中分配空間。當(dāng)你繼續(xù)添加到堆,你最終會耗盡內(nèi)存,所以 V8 將不得不運(yùn)行一個 GC 來清理。新創(chuàng)建的對象被分配得很快,并且當(dāng)對象死亡時被清理(更短和更快的收集)。一旦對象“生存”了一些(確切的說是2個周期)回收掃描周期時,它們被提升到老生區(qū),在一個多帶帶的循環(huán)中收集垃圾。
較舊的對象是幸存多于一個垃圾收集掃描的對象,這意味著它們?nèi)匀槐黄渌麑ο笠?,并且仍然需要占用該?nèi)存。他們通常不引用較年輕的對象,只是引用較舊的對象。大周期進(jìn)行的并不頻繁。一次大周期通常是在移動足夠多的對象至老生區(qū)后才會發(fā)生。
? sources.js內(nèi)存管理; 我喜歡閱讀 glossary 章節(jié),你會發(fā)現(xiàn)很多 GC 的概念.
this is a really good and v detailed repo on v8’s perf.
您可以查看 v8 repo 的 wiki,了解更多內(nèi)部信息,以及如何使用 v8 調(diào)試項目
on frame rates from firefox dev tools
另一個很好的指南 V8 && garbage collection
This guide is crossposted from lrlna’s sketchin guide on github ? ?.
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/91746.html
摘要:前端日報精選中的垃圾收集,圖文指南十個免費(fèi)的前端開發(fā)工具專題之遞歸如何在鏈中共享變量基于的爬蟲框架中文譯十六進(jìn)制顏色揭秘掘金掘金小書基本環(huán)境安裝小書教程中間件對閉包的一個巧妙使用簡書源碼分析掘金組件開發(fā)練習(xí)焦點(diǎn)圖切換前端學(xué) 2017-09-13 前端日報 精選 V8 中的垃圾收集(GC),圖文指南十個免費(fèi)的web前端開發(fā)工具JavaScript專題之遞歸 · Issue #49 · m...
摘要:在數(shù)據(jù)緩沖區(qū)已超過或?qū)懭腙犃挟?dāng)前正忙的任何情況下,將返回。當(dāng)返回值時,背壓系統(tǒng)啟動,它會暫停傳入的流發(fā)送任何數(shù)據(jù),并等待消費(fèi)者再次準(zhǔn)備就緒,清空數(shù)據(jù)緩沖區(qū)后,將發(fā)出事件并恢復(fù)傳入的數(shù)據(jù)流。 流中的背壓 在數(shù)據(jù)處理過程中會出現(xiàn)一個叫做背壓的常見問題,它描述了數(shù)據(jù)傳輸過程中緩沖區(qū)后面數(shù)據(jù)的累積,當(dāng)傳輸?shù)慕邮斩司哂袕?fù)雜的操作時,或者由于某種原因速度較慢時,來自傳入源的數(shù)據(jù)就有累積的趨勢,就像...
摘要:一前言的垃圾回收機(jī)制使用垃圾回收機(jī)制來自動管理內(nèi)存。垃圾回收器只會針對新生代內(nèi)存區(qū)老生代指針區(qū)以及老生代數(shù)據(jù)區(qū)進(jìn)行垃圾回收。分別對新生代和老生代使用不同的垃圾回收算法來提升垃圾回收的效率。 V8 實(shí)現(xiàn)了準(zhǔn)確式 GC,GC 算法采用了分代式垃圾回收機(jī)制。因此,V8 將內(nèi)存(堆)分為新生代和老生代兩部分。 一、前言 V8的垃圾回收機(jī)制:JavaScript使用垃圾回收機(jī)制來自動管理內(nèi)存。垃...
摘要:例如,和中的對象就是實(shí)現(xiàn)的對象,而對象的垃圾收集機(jī)制采用的是引用計數(shù)策略。因此,即使中的引擎使用標(biāo)記清除策略實(shí)現(xiàn),但是訪問的對象依然是基于引用計數(shù)策略的。垃圾回收器從不移動大對象。 Js GC原理: 找出那些不再繼續(xù)使用的變量,然后釋放其所占用的內(nèi)存,垃圾回收器會按照固定的時間間隔周期性地執(zhí)行這一操作 Js GC 策略: 標(biāo)記清除法 引用計數(shù) JavaScript 內(nèi)存分配: 在定...
摘要:的內(nèi)存限制和垃圾回收機(jī)制內(nèi)存限制內(nèi)存限制一般的后端語言開發(fā)中,在基本的內(nèi)存使用是沒有限制的。的內(nèi)存分代目前沒有一種垃圾自動回收算法適用于所有場景,所以的內(nèi)部采用的其實(shí)是兩種垃圾回收算法。 前言 從前端思維轉(zhuǎn)變到后端, 有一個很重要的點(diǎn)就是內(nèi)存管理。以前寫前端因?yàn)橹皇窃跒g覽器上運(yùn)行, 所以對于內(nèi)存管理一般不怎么需要上心, 但是在服務(wù)器端, 則需要斤斤計較內(nèi)存。 V8的內(nèi)存限制和垃圾回收機(jī)...
閱讀 2689·2023-04-25 20:28
閱讀 1868·2021-11-22 09:34
閱讀 3702·2021-09-26 10:20
閱讀 1856·2021-09-22 16:05
閱讀 3098·2021-09-09 09:32
閱讀 2530·2021-08-31 09:40
閱讀 2111·2019-08-30 13:56
閱讀 3327·2019-08-29 17:01