2016-05-01 3 views
0

Ich habe einen Code-Setup und Ich würde gerne wissen, ob es Müll sammelt, so dass mein System wird nicht beginnen Swapping und Freeze/Absturz.Wird mein 'neues Objekt' Müll auf Socket getrennt werden

Das Setup sollten Sie bleiben innerhalb der normalen Parameter des Systems eine unbestimmte Menge an Zeit laufen können unter der Annahme (zB so nicht anschließen 1.000.000 Benutzer auf einen einzelnen Thread Prozess alle zur gleichen Zeit)

Ich habe eine vereinfachte Version gemacht.

// connection.js 

var io, Handler; 
io = require('socket.io'); 
Handler = require('./handler'); 

io.on('connection', function (socket) { 
    new Handler({socket: socket}) 
}); 
// handler.js 

var Handler, 
    bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; 

    function Handler(arg) { 
    this.socket = arg.socket; 
    this.test = bind(this.test, this); 
    console.log('Handler', 'New connection', this.socket.id); 
    this.listeners(); 
    } 

    Handler.prototype.listeners = function() { 
    return this.socket.on('test', this.test); 
    }; 

    Handler.prototype.test = function() { 
    return console.log('SocketIO', 'test', this.socket.id); 
    }; 


module.exports = Handler; 

So ist neuen Handler "Garbage Collection, nachdem eine" Steckdose trennen Ereignis eingetreten ist?

Wenn nicht, wie soll ich den Code ändern?

Zuerst dachte ich, das

var io, connections, Handler; 
io = require('socket.io'); 
Handler = require('./handler'); 
connections = {} 

io.on('connection', function (socket) { 

    connections[socket.id] = new Handler({socket: socket}); 

    socket.on('disconnect', function(){ 
    connections[socket.id] = null 
    }) 
}); 

das Problem lösen könnte, aber das schafft nur einen Verweis auf die ‚neuen Handler‘ und entfernt die gleichen Bezug auf trennen. Das bedeutet nicht notwendigerweise, dass der "neue Handler" ebenfalls entfernt wird. Es könnte immer noch zuhören und/oder Sachen machen.

Antwort

1

Ihr Handler Objekt sollte Müll gesammelt werden, solange kein anderer Code einen Verweis darauf enthält.

Wenn der eigentliche Socket selbst geschlossen ist, weiß das System, dass die Ereignisbehandlungsroutinen nicht mehr aktiv sind und daher die Speicherbereinigung nicht verhindern. Der Browser macht die gleiche Sache, wenn Sie ein DOM-Objekt entfernen, auf dem Ereignishandler vorhanden sind, damit diese Ereignishandler die Garbage Collection nicht verhindern.

Also, wenn die socket geschlossen ist und socket.io irgendwelche Verweise auf das Javascript-Socket-Objekt gibt, sollte es keinen Code geben, der irgendwelche Verweise auf das Handler-Objekt mehr hat und es wird für Garbage Collection geeignet sein.

Wenn Sie Ihren eigenen Verweis auf das Handler Objekt, wie zB:

var connections = {}; 
io.on('connection', function (socket) { 
    connections[socket.id] = new Handler({socket: socket}); 
}); 

Dann werden Sie unten, dass der Bezug auf trennen, wie im Code löschen müssen. Andernfalls bleibt diese Referenz am Leben und verhindert, dass das Handler Objekt als Garbage Collection erfasst wird.

var connections = {}; 
io.on('connection', function (socket) { 
    connections[socket.id] = new Handler({socket: socket}); 

    socket.on('disconnect', function() { 
     delete connections[socket.id]; 
    }) 
}); 

Hinweis: Ich würde empfehlen, die Sie tatsächlich delete verwenden, um die Eigenschaft zu entfernen, anstatt es nur null Einstellung. Auf diese Weise erhalten Sie keine unbenutzten Objekte, die sich auf dem Objekt connections aufbauen.

+0

Danke Kumpel! = D Und löschen ist in der Tat besser! – Dex

Verwandte Themen