Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

identify memory leak of closure with memwatch-node

My Node.js project suffering memory leaking, I've already set variables to null in closure, I mean, I know code like this:

var a = 0;
var b = 1;
var c = 0;
example_func(c, func(){
    console.log(b);
});

Will cause memory leaks, so I add some code to set these variables to null;

var a = 0;
var b = 1;
var c = 0;
example_func(c, func(){
    console.log(b);
    a = null;
    b = null;
    c = null;
});

But I still got leaks, so I try to use memwatch-node to figure out what's wrong with my code.

And the result shows that closure causing the leak, but not specified enough to target.

I've got the JSON like this

 { what: 'Closure',
   '+': 12521,
   size: '520.52 kb',
   '-': 5118,
   size_bytes: 533016 },

And I am wondering if I could get more specific details about which closure is leaking.

I've assigned name for all closures, but still not work.

like image 516
bxshi Avatar asked Dec 10 '12 09:12

bxshi


1 Answers

You can't get more specific about which closure. memwatch gets a dump of the v8 heap and then takes differences of it and reports leaks if, after 5 successive garbage collection events, that object type count continued to grow.

Also, I believe you are confused on what closures are. The MDN page on closures gives a good description. A closure is not a variable, but a scope that enables functions to retain references and continue to work when used in a part of the code where those variable references would not otherwise be available.

If you pass functions around keep a reference to that function, it's closure could reference other closures. So, it's possible you have a single closure that could have a lot in it.

Do this: disable parts of your code until memwatch stops complaining. Then, look at that code. If you are still confused, post more details in this question.

like image 189
Edmond Meinfelder Avatar answered Sep 23 '22 02:09

Edmond Meinfelder