Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Detect node.js/javascript memory leak in code

I have some code that is working, however it has a memory leak in it.

What are some good strategies for tracking memory leaks in node.js?

What steps should I follow when looking for such leaks?

How can I track the leak in my code?

Thanks

like image 217
BenoitD Avatar asked Mar 30 '13 21:03

BenoitD


1 Answers

You can figure this out by profiling the memory usage of your application.

Javascript objects are allocated on the heap, so you'll want a tool that can dump the heap. After acquiring a heap dump you can inspect it and see how many instance of a given object (or function) exist.

E.g., for your code you know you create a socket whenever a user connects. Dumping the heap while three users are connected should show ~3 sockets. Dumping the heap after those users disconnect should show ~0 sockets.


You can actually use the Chrome heap dump analyzer with Node.js heap dumps.

  • Documentation on the Chrome heap dump analyzer: https://developers.google.com/chrome-developer-tools/docs/heap-profiling

  • Project that allows you to take Node.js heap dumps and inspect them in chrome: https://github.com/bnoordhuis/node-heapdump


Just fyi, functions are going to show up in the heap dump under the (closure) section.

You'll want to make sure you name your functions (even if they don't need a name) so they show up as something useful in the heap dump.

For example, something like

function() { }

will just show up as function() in the heap dump. Where as:

function taggedFunction() { }

will show up as function taggedFunction() in the heap dump. If you create 100 taggedFunctions then you'll see taggeFunction in the heap dump 100 times. Basically, naming your functions lets you figure out if you keep creating and leaking them.

like image 197
Matt Wonlaw Avatar answered Oct 14 '22 18:10

Matt Wonlaw