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都会收集垃圾。毕竟,IdleNotification只有在“V8 已完成尽可能多的清理工作” (文档)时才返回 true 。

事实上,垃圾只被清理*大约。每 100 次迭代。我错过了一步吗?junkArray出于某种原因不是垃圾立即吗frame

*通过比较前后堆使用情况确定

4

1 回答 1

6

而不是v8::V8::IdleNotification,尝试使用v8::Isolate::LowMemoryNotification. 据我所知,这是让最近的 V8 构建通过公共 API 进行完整 GC 的唯一方法。

于 2015-04-08T13:20:01.440 回答