2014-08-29 2 views
3

"자동 새로 고침"기능이있는 웹 페이지가 있습니다. 설정하면, 모든 사람은 두 번째 페이지는 아약스 (라고 page_request)를 통해 인출하고 제공 containerid와 사업부 컨테이너의 내용을 대체자바 스크립트 유출 유형 진단

document.getElementById(containerid).innerHTML=page_request.responseText; 

이, 대부분의 시간에 아무 문제가 작동하지 않습니다. 다음 스크립트는 page_response에있을 때

문제가 발생합니다 :

<script type=\"text/javascript\"> 
    $(document).ready(function() { 
     dtable = $('#multi-stat-table').dataTable(); 
    }); 
</script> 

이 스크립트는 정렬 테이블에 ID가 "멀티 통계 테이블"는 DataTables jQuery 플러그인을 사용하여 테이블을집니다. 스크립트가 작동하고 정렬 가능한 테이블이 있습니다. 그러나 자동 새로 고침이 켜져 있으면 메모리 누수가 발생하여 결국 전체 힙 (천천히 그러나 확실하게)을 소비하게됩니다.

이 현상은 top과 chrome의 메모리 프로파일 러를 사용하여 확인할 수 있습니다. 1 초마다 ~ 70KB 데이터가 할당되지만 ~ 20KB 만 해제됩니다. 따라서 초당 50KB 힙 메모리의 순 손실이 있습니다. 프로파일 러에서 메모리를 차지하고있는 객체를 살펴 보았지만 이러한 배열과 객체가 실제로 참조하는 것이 아닌 비 - 기술 번호를 파악하는 것은 매우 어렵습니다. 아무 소용,

Memory Leak

내가 각 자동 새로 고침하기 전에 null로 dtable 설정을 시도했다 : 나는 가비지 수집기가 매초마다 말뚝 이들 않는 객체를 수집하는 방법을 알아낼 수 없었습니다 . 또한 dtable.api(). clear() 및 dtable.api(). destroy()를 호출하려고 시도했지만 누수가 지속됩니다. 이 누출을 어떻게 찾을 수 있습니까? 그리고 더 중요한 것은 그것을 막기 위해 무엇을 할 수 있습니까?

+0

을 믹스 앤 매치 할 위험 할 수 있습니다 중간에 스크립트 태그를 포함하는 서버에서 HTML의 조각이 튀어 나와 한 번만 언급해도 아니지만 한 번이라도 귀하의 페이지를 읽는 것은 모든 종류의 나쁜 일이 발생하게하는 독창적 인 방법처럼 보입니다. –

+0

알아,하지만 그것은 "레거시 코드" – RPGillespie

답변

1

정확한 메모리 누수 원인을 정확히 찾아 낼 수있었습니다.

저는 처음에 Chrome의 프로파일 러를보고 jQuery의 캐시 객체가 45MB 상당의 객체를 참조하고있을 때 jQuery 캐시 문제 일 수 있다는 생각을했습니다. 연구의 조금 후에, 이것은 내가 그것을 해결하는 방법을 알아낼 도움이 내가 읽은 기사는 다음과 같습니다 http://javascript.info/tutorial/memory-leaks#jquery-anti-leak-measures-and-leaks

내가이 일을하기 전에 : document.getElementById를 (containerid) .innerHTML = page_request.responseText; // containerid 내부에 jQuery가 나중에 참조하는 경우 위험합니다!

수정 후 : $ ("# 컨테이너") .html (page_request.responseText); // HTML은()

참고 자체에 containerid의 내부 캐시되지 않은 객체를 역 참조 : jQuery를 비 jQuery를 DOM

관련 문제