A surprising JavaScript memory leak found at Meteor
TL;DR -- all closures created within a function are retained even if only one closure is ever referenced. This is really interesting, and potentially devastating for certain coding styles.<p>I ran the code on node and the RSS does appear to be increasing without bound. Even running node with --expose-gc and forcing a global.gc() inside logIt() causes the same unbounded memory growth.<p>Increasing the size of the array by a factor of 10 causes RSS usage to jump up by a factor of 10 every second, so we know that the memory usage isn't caused by creating a new long-lived closure (i.e., the logIt() function) every second.<p>In fact, removing the call to doSomethingWithStr() doesn't change the unbounded memory growth.<p>Here's a shorter snippet that demonstrates the leak more dramatically (about 10 MB/sec RSS growth):<p><pre><code>  var run = function () {
    var str = new Array(10000000).join('*');
    var fn  = function() {
      str;
    }
    var fn = function() { }
    setInterval(fn, 100);
  };
  setInterval(run, 1000);
</code></pre>
Tried it out on node v0.8.18