V8不会清理所有垃圾

Bar*_*lom 9 javascript v8 embedded-v8

我在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

从C++开始,我正在运行一个循环:

  • 打电话frame.
  • 收集垃圾: while(!V8::IdleNotification()) {};

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

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

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

Bit*_*tex 5

而不是v8::V8::IdleNotification,尝试使用v8::Isolate::LowMemoryNotification.据我所知,这是让最近的V8版本通过公共API完成GC的唯一方法.