2011-01-28 7 views
1

나는 작업해온 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 트리가 제대로 정리되지 않은 것 같습니다. 누군가가 나를 도울 수 있다면 그것은 위대 할 것입니다.

+0

왜 request.abort()를 수행합니까? –

+0

나는 절대적으로 필요하지는 않다고 생각하는데, 나는 단지 타임 아웃 코드에서 그것을 복사하고 붙여 넣기 만해도 아무런 문제가 발생하지 않는다. – user535617

+2

jQuery를 사용해야합니다. :) – ChaosPandion

답변

1

IE가 반환하는 responseXML은 MSHTML DOM 대신 실제로 MSXML DOM이므로 개발자는 selectNodes 및 selectSingleNode 함수를 사용할 수 있습니다. MSXML DOM에는 자체 garbage collection mechanism이 있으므로 DOM이 범위를 벗어나면 바로 메모리를 알아 채지 못합니다. 따라서, 이것은 아마도 진정한 메모리 누수가 아니라 지연이없는 것이라고 말할 수 있습니다.

0

당신은 같은 동일한 범위 공유하는 익명의 함수로 응답 핸들러를 넣을 경우 너무 누출합니까

var request = new XMLHttpRequest(); 
request.open("GET", url, true); 
request.onreadystatechange = function(){ 
    if (4 == request.readyState){ 
    ... 
    } 
} 

를?

+0

예, 제가 질문에 명시된 바와 같이 저는 거의 100 % 확실한 문제는 responseXML을 얻는 것입니다. – user535617

+0

이상 하네. 위의 코드는 누출없이 수년간 사용했습니다. 다른 간단한 XML을 사용해 보았습니까? – Mic