[英]When and How JavaScript garbage collector works
我確實在 MDN 上讀過幾篇這樣的文章, 這篇文章讓我了解了 GC 在 JavaScript 中是如何發生的
我仍然不明白之類的東西
a) 垃圾收集器何時啟動(它在某個時間間隔或必須滿足某些條件后被調用)?
b) 誰負責垃圾收集(它是 JavaScript 引擎或瀏覽器/節點的一部分)?
c) 在主線程或單獨線程上運行?
d) 以下哪一項具有更高的峰值 memory 使用?
// first-case
// variables will be unreachable after each cycle
(function() {
for (let i = 0; i < 10000; i++) {
let name = 'this is name' + i;
let index = i;
}
})()
// second-case
// creating variable once
(function() {
let i, name, index;
for (i = 0; i < 10000; i++) {
name = 'this is name' + i;
index = i;
}
})()
V8 開發人員在這里。 簡短的回答是:它很復雜。 特別是,不同的 JavaScript 引擎,以及同一引擎的不同版本,會做不同的事情。
要解決您的具體問題:
a) 垃圾收集器何時啟動(它在某個時間間隔或必須滿足某些條件后被調用)?
要看。 大概兩者兼而有之。 現代垃圾收集器通常是分代的:它們有一個相對較小的“年輕一代”,只要它滿了就會被收集。 此外,他們有一個更大的“老一代”,他們通常在許多小步驟中完成他們的工作,以便永遠不會中斷執行太長時間。 觸發這樣一個小步驟的一種常見方法是自上一步以來已經分配了 N 個字節(或對象)。 另一種方法,尤其是在現代選項卡式瀏覽器中,是在選項卡處於非活動狀態或在后台時觸發 GC 活動。 除了這兩個之外,很可能還有其他觸發因素。
b) 誰負責垃圾收集(它是 JavaScript 引擎或瀏覽器/節點的一部分)?
垃圾收集器是 JavaScript 引擎的一部分。 也就是說,它必須與相應的嵌入器進行某些交互,以處理其生命周期以一種或另一種方式與 JavaScript 對象相關聯的嵌入器管理的對象(例如 DOM 節點)。
c) 在主線程或單獨線程上運行?
要看。 在現代實現中,通常兩者都有:一些工作發生在后台(在一個或多個線程中),一些步驟在主線程上執行效率更高。
d) 以下哪一項具有更高的峰值 memory 使用?
這兩個片段將(可能)具有相同的峰值 memory 用法:它們都不允許同時訪問由多個迭代分配的對象。
編輯:如果您想了解更多有關 V8 近期 GC 相關工作的信息,您可以在此處找到一系列博客文章: https://v8.dev/blog/tags/memory
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.