V8不能清理所有垃圾。

10

我在V8中清理垃圾时遇到了困难。首先,我的Javascript代码如下:

var bigstring = "ASD";
for (var b = 0; b < 20; b++) {
    bigstring = bigstring + bigstring;
}
trace("bigstring " + bigstring.length);

function frame() {
    // generate some garbage
    var junkArray = [];
    for (var i = 0; i < 1000; i++) {
        junkArray.push(i + bigstring);
    }
}

使用 C++,我正在运行一个循环:

  • 调用 frame
  • 收集垃圾: while(!V8::IdleNotification()) {};

预期结果是每次迭代都会收集 junkArray 垃圾。毕竟,只有当“V8 已经完成了尽可能多的清理工作”(doc) 时,IdleNotification 才会返回 true。

事实上,垃圾只有在大约每 100 次迭代后才被清理*。我是否漏掉了什么步骤?为什么 junkArrayframe 后不立即成为垃圾?

*通过比较使用前后的堆使用量来确定

1个回答

6

与其使用 v8::V8::IdleNotification,不妨尝试使用v8::Isolate::LowMemoryNotification。据我所知,这是获取最近的 V8 构建通过公共 API 执行完整 GC 的唯一方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接