編集: Yury の答えの方が優れています。
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などの実装を確認することをお勧めします