2016-12-27 1 views
3

js 멀티 플레이어 게임에서 메모리 누수가 발생했습니다. 나는 클라이언트가 서버에 연결될 때 많은 콜백을 묶는다. 내 질문은 플레이어의 테이블에서 소켓을 삭제하기 전에 콜백을 바인딩 해제해야합니까? 플레이어의 다음 소켓을 삭제하기 전에 바인딩 해제 콜백이 필요합니까?

Player.prototype.viewPortListenerInit = function(){ 
    var self = this; 

    this.socket.on('clientViewPortResize', function(data){ 
    self.clientViewPort = data; 
    }); 

    }; 

목록에 플레이어를 추가/HashSet의 :

this.list[socket.id] = new Player(socket); 

그리고 여기가 삭제됩니다 : 여기

내 샘플 콜백입니다

socket.on('disconnect', function(){ 
     delete this.list[socket.id] 
}); 
+0

https://www.alexkras.com/simple-guide-to-finding-a-javascript-memory-leak-in-node-js/ 나는 단지 이것을 훑어 보았지만 아마 모든 것을 제거하는 것을 잊어 버린 것처럼 들리네. 물건에 대한 참조. –

+0

"삭제"란 무엇을 의미합니까? 그리고 그것을 어디로부터 풀어 낼 것입니까? 정말로해야 할 일은 이벤트를 트리거하는 곳의 소켓에 대한 참조를 제거하는 것입니다. – Bergi

+0

나는 선수 명단이 있는데 나는 다음과 같이 삭제를 수행한다 : delete this.list [socket.id]; – peterSweter

답변

2

가 인스턴스 EventEmitter (소켓과 같은)에 대한 참조가 없으므로 콜백으로 가비지 수집됩니다.

+0

그래,하지만이 콜백 안에 Player 개체에 대한 참조가 있고 플레이어 개체는 소켓에 대한 참조를 유지합니다. 아직도 수집됩니까? – peterSweter

+1

가비지 수집 대상이 아닌 개체에 대한 참조가있는 경우 –

+0

플레이어 목록에서 Player 개체를 삭제 한 후에는 소켓 콜백을 제외하고 프로그램에서 소켓에 도달 할 수 없습니다. 이 소켓을 언 바인드하거나 socket.disconect()를 만들 필요가 있습니까? – peterSweter

관련 문제