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