簡體   English   中英

JavaScript 垃圾收集器何時以及如何工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM