2012-09-19 2 views
0

jQuery.ajax()로 메모리 누수가 발생합니다. 나는 herehere 제안을 따랐지만 여전히 메모리 누수가 발생합니다. 나는 GV API가 메모리를 누출하기 때문에 본질적으로 Google 시각화 API를 내 API로 대체하려고합니다. 내 코드의 스 니펫은 다음과 같습니다.jQuery 아약스의 메모리 누수

RiseVision.Common.Visualization.Query = function(url) { 
    this.baseURL = url + "&tqx=responseHandler:setResponse"; 
    this.url = this.baseURL; 
} 
RiseVision.Common.Visualization.Query.prototype.send = function(callback) { 
    var self = this; 

    this.callback = callback; 
    this.hasResponded = true; 
    this.timerID = setInterval(function() { 
     if (self.hasResponded) { 
      self.hasResponded = false; 
      self.sendQuery(); 
     } 
    }, this.refreshInterval); 
} 
RiseVision.Common.Visualization.Query.prototype.sendQuery = function() { 
    var request = $.ajax({ 
     url: this.url, 
     context: this, 
     jsonpCallback: "setResponse", 
     dataType: "jsonp", 
     success: function(json) { 
      var response = new RiseVision.Common.Visualization.QueryResponse(json); 

      if (json.sig != null) { 
       this.url = this.baseURL + ";sig:" + json.sig; 
      } 

      if ((response.getStatus() == "error") && (response.getReasons() == "not_modified")) { 
      } 
      else { 
       this.callback(response); 
      } 

      response = null; 
      this.hasResponded = true; 
     } 
    }); 

    //This is supposed to mitigate the memory leak. 
    request.abort = null; 
    request = null; 
} 

저는 jQuery 1.8을 사용하고 있습니다. refreshInterval은 실시간 데이터를 가져 오기 때문에 1 초입니다. Chrome의 작업 관리자에서 볼 수있는 점은 점진적인 메모리 증가입니다. 약 5 분 후에 가비지 수집이 시작되고 메모리가 떨어집니다. 문제는 메모리가 시작된 것과 동일한 수준으로 메모리가 떨어지지 않는다는 것입니다. 예를 들어, 메모리는 50K에서 시작하여 점진적으로 60K로 증가한 다음 가비지 콜렉션이 시작되고 메모리가 52K로 떨어집니다. 이제 62K로 증가하고 54K로 떨어집니다. 등등. 결국, 이것은 브라우저를 망칠 것입니다.

setInterval 대신 setTimeout을 시도했습니다. 그건 더 나빠 보인다. 성공 처리기를 자체 함수에 넣으려고했습니다. 도와주지 않았어. 전혀 http://jsfiddle.net/aADXq/7/

어떤 제안 -

여기에 문제를 설명하는 jsfiddle이야?

Thx.

+0

대답이 없지만 크롬 개발자 도구를 사용하여이 메모리 누수 감지 방법을 시도해 볼 수 있습니다. http://gent.ilcore.com/2011/08/finding-memory-leaks.html – sdespont

답변

0

아약스 요청의 dataType을 'text'로 변경 한 다음 결과 문자열을 json_parse.js으로 구문 분석하십시오. 이 라이브러리는 메모리를 먹어 치우는 eval을 사용하지 않고 json을 재귀 적으로 구문 분석합니다.

+0

jQuery는 'eval 'JSON을 구문 분석합니다. – MacMac