2012-03-21 2 views
3

여기 dev에 (공식 125213 빌드) 내가 구글 크롬 19.0.1061.1에서 실행되는 일부 코드를입니다 "Private Memory"가 무한정 자라고 있습니다 (8GB RAM 구성). 내가 위에서처럼 뭔가에 코드 샘플을 변경하는 경우 :메모리 누수 및 setInterval을

<html> 
<title>Memory Leak</title> 
<script type="text/javascript"> 
    (function(){ 
     var xhr = new XMLHttpRequest(); 
     var timeout = this.window.setInterval(function() { 
      xhr.open('GET', '', false); 
      xhr.send(); 
     }, 50); 
    }).call(this); 
</script> 
</html> 

지금은 괜찮습니다.

나는 그것을 얻지 않는다. 이 setInterval 함수에 대한 참조를 유지하는 것이 도움이되고 이 단지 xhr을 정의하는 데 도움이되는 이유는 이전에 선언이 닫혀 있었기 때문에 도움이 되었습니까? 그것은 v8에만 관련이 있습니까?

감사의 말에 감사드립니다.

+0

시간 제한에 대한 참조를 유지하면 누출을 정리하는 데 도움이되지 않습니다. XHR 개체를 다시 사용하여 누출을 방지합니다. 참고 : 서버에서 응답을 읽으려고하면 50ms 후에 덮어 쓰기 때문에 중단됩니다. –

+0

- 범위 기능에서 호출을 사용하는 이유는 무엇입니까? (function (context) {console.log (context)/* window * /}) (this); (function (context) {console.log (context)/* window * /}) (window); (function() {console.log (this)/* window * /})(); – elmuchacho

답변

8

처음에는 iterator 함수를 호출 할 때마다 새로운 XMLHttpRequest 객체를 인스턴스화합니다. 요청 객체는 적어도 HTTP 요청이 완료 될 때까지 유지됩니다. 초당 200 개의 HTTP 요청을 시작하면 실제로 모든 요청을 수행하지 않으므로 브라우저가 막히게 막힐 것입니다. 동시에 열리는 동시 연결 수에는 제한이 있습니다.

0

첫 번째 예에서는 각 간격으로 XMLHttpRequest()의 새 인스턴스를 호출합니다. 두 번째 예제에서는 코드를 한 번 인스턴스화하고 코드의 수명 내내 사용합니다. 이것이 첫 번째 예제에서 메모리가 부족한 이유입니다.

1

이 http 호출에는 얼마나 걸립니까? 이 시간이 50ms (매우 짧은 시간)가 걸리면 첫 번째 경우는 보류중인 요청이 더 많이 생성되고 두 번째 경우는 이전 XMLHttpRequest를 다시 사용하면서 이전 호출을 취소 할 수 있습니다.