2016-05-01 8 views
0

コード設定があります。がガベージコレクトされているかどうか知りたいので、システムがスワッピングとフリーズ/クラッシュを開始しません。私の 'new Object'はソケット切断時にガベージコレクトされるでしょう

セットアップが(例えばので、すべてが同時に1つのスレッド処理への1.000.000ユーザーを接続していない)、あなたのシステムの正常なパラメータ内にとどまると仮定すると、時間の不確定な量を実行することができます

私は単純化したバージョンを作った。

// 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; 

ので「新しいハンドラ」ガベージコレクトのソケット切断イベント「後が発生しているのですか?

コードを変更する必要はありませんか?

最初に私は、これが問題

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 
    }) 
}); 

を解決する可能性があります。しかし、これは唯一の新しいハンドラ」への参照を作成し、切断時に、同じ参照を削除しますと思いました。必ずしも「新しいハンドラ」も削除されるわけではありません。それはまだ聞いているかもしれないし、やっているかもしれない。

答えて

1

あなたのHandlerオブジェクトは、あなたの他のコードが参照を保持していない限り、ガベージコレクションを取得する必要があります。

実際のソケット自体が閉じられていると、システムはイベントハンドラが稼働していないことを認識しており、ガベージコレクションを妨げません。これらのイベントハンドラがガベージコレクションを妨げないように、イベントハンドラを持つDOMオブジェクトを削除すると、ブラウザは同じことを行います。だから、

socketが閉じられるとsocket.ioリリースJavascriptのソケットオブジェクトにそれが持っているすべての参照、任意のより多くのHandlerのオブジェクトへの参照を持っており、それがガベージコレクションの対象になります何のコードがあってはなりません。

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

はその後、あなたは以下のコードのように、切断時にその参照をクリアする必要があります:あなたのようなHandlerオブジェクトへの独自の参照を行った場合

。そうでなければ、この参照は生き続けることになり、Handlerオブジェクトはガベージコレクトされません。

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

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

注:私はちょうどnullに設定するのではなく、あなたが実際にプロパティを削除するdeleteを使用することをお勧めしたいです。そうすれば、connectionsオブジェクト上に未使用のプロパティが構築されることはありません。

+0

ありがとうございました! = Dそして削除は本当に良いです! – Dex

関連する問題