编辑:尤里的回答更好。
tl; dr IMO 没有内存泄漏。正斜率只是 setInterval 和 setTimeout 的效果。垃圾被收集,如锯齿模式所见,这意味着根据定义没有内存泄漏。(我认为)。
我不确定有没有办法解决这个所谓的“内存泄漏”。在这种情况下,“内存泄漏”是指对 setInterval 函数的每次调用都会增加内存使用量,如内存分析器中的正斜率所示。
现实情况是没有实际的内存泄漏:垃圾收集器仍然能够收集内存。根据定义,内存泄漏“发生在计算机程序获取内存但未能将其释放回操作系统时”。
如下面的内存配置文件所示,没有发生内存泄漏。每个函数调用都会增加内存使用量。OP 预计,因为这是一遍又一遍地调用同一个函数,所以不应该增加内存。然而,这种情况并非如此。每个函数调用都会消耗内存。最终,垃圾被收集起来,形成锯齿图案。
我已经探索了几种重新排列间隔的方法,它们都导致相同的锯齿模式(尽管一些尝试导致垃圾收集永远不会发生,因为引用被保留)。
function doIt() {
console.log("hai")
}
function a() {
doIt();
setTimeout(b, 50);
}
function b() {
doIt();
setTimeout(a, 50);
}
a();
http://fiddle.jshell.net/QNRSK/14/
function b() {
var a = setInterval(function() {
console.log("Hello");
clearInterval(a);
b();
}, 50);
}
b();
http://fiddle.jshell.net/QNRSK/17/
function init()
{
var ref = window.setInterval(function() { draw(); }, 50);
}
function draw()
{
console.log('Hello');
}
init();
http://fiddle.jshell.net/QNRSK/20/
function init()
{
window.ref = window.setInterval(function() { draw(); }, 50);
}
function draw()
{
console.log('Hello');
clearInterval(window.ref);
init();
}
init();
http://fiddle.jshell.net/QNRSK/21/
显然setTimeout
并且setInterval
不是 Javascript 的正式部分(因此它们不是 v8 的一部分)。实施留给实施者。我建议你看看node.js 中 setInterval 等的实现