나는 작업해온 Javascript 파일에서 메모리 누수를 추적 해 왔으며 마지막으로 reamining 한 범인 중 하나를 발견했습니다. XMLHttpRequest에서 responseXML을 얻었을 때 응답이 삭제되지 않는다고 생각합니다. 나는 그것을 삭제하는 방법을 모르겠다, 나는 자식 노드를 제거한 다음 null로 설정 (가비지 컬렉션이 작동하기를 원함)하고 또한 delete 키워드를 사용하여 시도했다. 이 두 가지 모두 도움이되지 않았습니다. 아래는 문제가되는 코드의 일부입니다 (요청 자체를 제거하는 일부 시간 초과 작업은 생략했지만 이는 메모리 누수의 원인이 아닙니다). 당신은 코드에서 볼 수 있듯이Javascript responseXML memory leak
var request = new XMLHttpRequest();
request.open("GET", url, true);
request.onreadystatechange = onReadyStateChange1;
request.send();
}
function onReadyStateChange1()
{
if (4 == request.readyState)
{
if (request.status == 200)
{
request.responseXML; //It leaks even if I just do this.
//me.ParseData(request.responseXML);
me.disconnected = 0;
} else
{
me.disconnected += 1;
}
request.onreadystatechange = noop; //noop is an empty function
request = null;
me = null;
}
}
, 심지어 ParseData를 호출하지 않는, 그냥 request.responseXML;
을 넣어 그것은 여전히 누수. 내가 그 라인을 밖으로 언급한다면, 누출은 사라진다. ParseData 함수 또는 다른 곳에 누수가 없다는 것을 의미하는 것은 responseXML입니다. responseXML의 트리 구조와 관련이 있다고 생각합니다. DOM 트리가 제대로 정리되지 않은 것 같습니다. 누군가가 나를 도울 수 있다면 그것은 위대 할 것입니다.
왜 request.abort()를 수행합니까? –
나는 절대적으로 필요하지는 않다고 생각하는데, 나는 단지 타임 아웃 코드에서 그것을 복사하고 붙여 넣기 만해도 아무런 문제가 발생하지 않는다. – user535617
jQuery를 사용해야합니다. :) – ChaosPandion