Skip to content

Instantly share code, notes, and snippets.

@nicokaiser
Created April 11, 2012 21:05
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save nicokaiser/2362575 to your computer and use it in GitHub Desktop.
Save nicokaiser/2362575 to your computer and use it in GitHub Desktop.
node.js 0.6.x garbage collector fail
var WebSocket = require('ws')
// open 200 connections that close after 5 seconds
for (var i = 0; i < 200; i++) { openWs() }
function openWs() {
var ws = new WebSocket('ws://localhost:8080')
ws.on('open', function() {
ws.send('hello')
setTimeout(function() { ws.close(); }, 5000)
});
}
connected: 0, not garbage collected: 0
connected: 0, not garbage collected: 0
connected: 80, not garbage collected: 80 <-- "node client.js" is started
connected: 200, not garbage collected: 200
connected: 200, not garbage collected: 200
connected: 200, not garbage collected: 200
connected: 200, not garbage collected: 200
connected: 125, not garbage collected: 132
connected: 0, not garbage collected: 7
connected: 0, not garbage collected: 7
connected: 0, not garbage collected: 7
connected: 200, not garbage collected: 207 <-- "node client.js" is started
connected: 200, not garbage collected: 207
connected: 200, not garbage collected: 207
connected: 200, not garbage collected: 207
connected: 200, not garbage collected: 207
connected: 0, not garbage collected: 26
connected: 0, not garbage collected: 26
connected: 0, not garbage collected: 26
connected: 0, not garbage collected: 26
connected: 0, not garbage collected: 26
connected: 200, not garbage collected: 226 <-- "node client.js" is started
connected: 200, not garbage collected: 226
connected: 200, not garbage collected: 226
connected: 200, not garbage collected: 226
connected: 200, not garbage collected: 226
connected: 0, not garbage collected: 30
connected: 0, not garbage collected: 30
connected: 0, not garbage collected: 30
connected: 0, not garbage collected: 30
connected: 0, not garbage collected: 30
connected: 0, not garbage collected: 30
...
(the 30 sockets are never gc'ed, even after some minutes)
// npm install weak ws
// run with "node --expose_gc server.js"
var weak = require('weak')
, httpServer = require('http').createServer()
, WebSocketServer = require('ws').Server
var count = 0
, countGc = 0
, wss = new WebSocketServer({ server: httpServer })
setInterval(function() {
if (typeof gc === 'function') gc()
console.log('connected: %d, not garbage collected: %d', count, countGc)
}, 1000)
wss.on('connection', function(ws) {
ws.send('hello')
// count client objects not garbage collected
countGc++
weak(ws, function() { countGc-- })
// count connected clients
count++
ws.on('close', function() { count-- })
})
httpServer.listen(8080)
@filipednb
Copy link

version 0.10.4
connected: 200, not garbage collected: 200
connected: 200, not garbage collected: 200
connected: 200, not garbage collected: 200
connected: 200, not garbage collected: 200
connected: 199, not garbage collected: 200
connected: 0, not garbage collected: 3
connected: 0, not garbage collected: 3
connected: 0, not garbage collected: 3
connected: 0, not garbage collected: 3
connected: 0, not garbage collected: 3
connected: 0, not garbage collected: 3
connected: 0, not garbage collected: 3
connected: 0, not garbage collected: 3
connected: 0, not garbage collected: 3
-> stop client -> run again
connected: 0, not garbage collected: 3
connected: 0, not garbage collected: 3
connected: 200, not garbage collected: 200
connected: 200, not garbage collected: 200
connected: 200, not garbage collected: 200
connected: 200, not garbage collected: 200
connected: 200, not garbage collected: 200
connected: 0, not garbage collected: 0
connected: 0, not garbage collected: 0
connected: 0, not garbage collected: 0
connected: 0, not garbage collected: 0
connected: 0, not garbage collected: 0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment