node.js - Why does nodejs have incremental memory usage? -
i have gameserver.js file on 100kb's in size. , kept checking task manager after each refresh on browser , kept seeing node.exe
memory usage keep rising every refresh. i'm using ws
module here: https://github.com/websockets/ws , figured, know what, there memory leak in my code somewhere....
so double check , isolate issue created test.js
file , put in default ws
code block:
var websocketserver = require('ws').server , wss = new websocketserver({ port: 9300 }); wss.on('connection', function connection(ws) { ws.on('message', function incoming(message) { console.log('received: %s', message); }); });
and started up:
now, check node.exe
's memory usage:
the incremental part makes me confused is:
if refresh browser makes connection port 9300
websocket server , @ task manager.. shows:
which at: 14,500 k
.
and keeps on rising upon each refresh, theoretically if keep refreshing go through roof. intended? there memory leak in ws
module somewhere maybe? whole reason ask because thought maybe in few minutes or when user closes browser go down doesn't.
edit: , core reason why wanted test because figured had memory leak issue in personal code somewhere , wanted check if wasn't me, or vice versa. i'm stumped.
seeing increased memory footprint node.js application normal behaviour. node analyses running code, generates optimised code, reverts unoptimised code (if needed) etc. requires quite lot of memory simple of applications (node.js large part written in javascript follows same optimisations/deoptimisations own code).
additionally, process may granted more memory when needs it, many operating systems remove allocated memory process when decide needed elsewhere (i.e. process). application can, in peaks, consume 1 gb of ram, garbage collection kicks in, usage drops 500 mb process may still keep 1 gb.
detecting presence of memory leaks
to analyse memory usage , memory leaks, must use node's process.memoryusage()
.
you should set interval dumps memory usage file i.e. every second, apply "stress" on application on several seconds (i.e. web servers, issue several thousand requests). take @ results , see if memory keeps increasing or if follows steady pattern of increasing/decreasing.
detecting source of memory leaks
the best tool node-heapdump. use chrome debugger.
- start application , apply initial stress (this generate optimised code , "warm-up" application)
- while app idle, generate heapdump
- perform single, additional operation (i.e. 1 more request) suspect cause memory leak - trickiest part large apps
- generate heapdump
- load both heapdumps chrome debugger , compare them - if there memory leak, see there objects allocated during single request not released afterwards
- inspect object determine leak occurs
i had opportunity investigate reported memory leak in sails.js framework - can see detailed description of analysis (including pretty graphs etc.) on this issue.
there detailed article working heapdumps strongloop - suggest have @ it.
Comments
Post a Comment