3

나는 다음과 같은 방법으로 이벤트 리스너/처리기 함께 일하고 : 'initBuilder'와Javascript mousemove 빈 이벤트 처리기에서 메모리 누출?

var _builder_canvas = document.getElementById("Builder"); 

    mouseMove = function() { 
    } 

    initBuilder = function() { 
     // Add mouse listener events 
     _builder_canvas.addEventListener('mousemove', mouseMove, true); 
    } 

이 주 문서의 온로드 핸들러 호출된다.

위의 빈 함수를 사용하더라도 Chrome (23.0.1271.64) 또는 FF (16.0.2)에서이 코드를 실행하면 마우스를 움직일 때마다 메모리가 할당되어 절대로 해제되지 않습니다.

메모리 누수를 피하기 위해 항상 이벤트 리스너를 제거해야한다는 것을 알고 있지만, mousemove 핸들러 일 때 어떻게합니까? 핸들러는 페이지가 열려있을 때마다 활성화되어 있어야합니다.

mouseup 또는 mousedown과 비슷한 방식으로 리스너/핸들러를 추가해도 메모리가 추가로 할당되지 않는다는 사실을 발견했습니다.

여기에 근본적인 것이 없습니까? 모든 통찰력은 인정 될 것이다.

+1

나는 코드를 너무 많이 작성했다고 생각합니다. :-) 우리는'mousemove' 핸들러가 호출과 관련된 메모리가 왜 공개되지 않는지를 이해할 수 있도록하기 위해 무엇을하는지 알아야합니다. 표시된 것처럼 실제로 비어있는 경우 전화와 관련된 메모리가 즉시 출시 될 수 있으며 Chrome은 이와 같은 단순한 경우를 최적화하는 데 상당히 적합합니다. 내 생각 엔 당신의 처리기가 (부주의하게) 일을 묶는 무언가를 수행한다는 것입니다. –

+1

각 _mousemove_와 같은 증상은 추가 이벤트 핸들러 또는 GCd가 아닌 다른 변수를 등록하는 것과 같습니다. –

+0

@ T.J.Crowder : 핸들러에서 아무 것도하지 않으면 서 위와 같이 빈 함수가있을 때 메모리 문제가 발생합니다. – user1812575

답변

0

devtools> timeline을 사용하여 메모리 사용을 기록하면 이벤트가 시작된 후 메모리가 잘 할당 해제됩니다.