簡體   English   中英

V8是否對范圍的各個部分進行垃圾收集?

[英]Does V8 do garbage collection on individual pieces of a scope?

我對V8是否對范圍內的各個變量的內容進行垃圾收集,或者它是否只對整個范圍進行垃圾收集感興趣?

所以,如果我有這個代碼:

function run() {
    "use strict";
    var someBigVar = whatever;
    var cnt = 0;

    var interval = setInterval(function() {
        ++cnt;
        // do some recurring action
        // interval just keeps going
        // no reference to someBigVar in here
    }, 1000);

    someBigVar = somethingElse;
}

run();

V8垃圾會收集一些someBigVar嗎? 由於setInterval()回調, run()的閉包仍然存活,顯然cnt變量仍然被使用,因此run()的整個范圍不能被垃圾回收。 但是,沒有實際的持續參考someBigVar

V8只垃圾一次收集整個范圍嗎? 那么,在間隔停止之前, run()的范圍不能被垃圾收集? 或者它是否足夠智能垃圾收集someBigVar因為它可以看到間隔回調中沒有實際引用someBigVar

僅供參考,這是一篇關於V8垃圾收集有趣概述文章 (它沒有解決這個具體問題)。

是的,它確實。 僅保留在閉包內實際使用的變量。 否則,閉包必須捕獲外部作用域中定義的所有內容,這可能很多。

唯一的例外是如果在閉包內使用eval 由於無法靜態確定eval參數所引用的內容,因此引擎必須保留所有內容。

這是一個使用模塊演示此行為的簡單實驗(使用--expose-gc標志運行):

var weak = require('weak');
var obj = { val: 42 };

var ref = weak(obj, function() {
  console.log('gc');
});

setInterval(function() {
  // obj.val;
  gc();
}, 100)

如果封閉內部沒有引用ref ,你會看到gc打印出來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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