Internet Explorer에서 Simple jQuery Ajax 호출로 메모리 누수가 발생함
1초마다 Ajax에 전화하는 웹 페이지를 만들었습니다.Internet Explorer 7에서는 메모리 누수가 심합니다(약 15분 동안 20MB).
그 프로그램은 매우 간단하다.Ajax 자바스크립트서버는 빈 문자열을 반환하고 JavaScript 코드는 빈 문자열을 반환하지 않습니다. 용 i i i i를 쓴다.setTimeout
1초마다 기능을 작동시키고, 그걸 보기 위해 드립을 사용하고 있어요.
출처는 다음과 같습니다.
<html>
<head>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load('jquery', '1.4.2');
google.load('jqueryui', '1.7.2');
</script>
<script type="text/javascript">
setTimeout('testJunk()',1000);
function testJunk() {
$.ajax({ url: 'http://xxxxxxxxxxxxxx/test', // The url returns an empty string
dataType: 'html',
success: function(data){}
});
setTimeout('testJunk()',1000)
}
</script>
</head>
<body>
Why is memory usage going up?
</body>
</html>
이 새는 곳을 어떻게 막죠?이렇게 큰 테이블을 업데이트하는 실제 어플리케이션을 가지고 있지만, 방치하면 기가바이트의 메모리가 소모됩니다.
편집: 좋습니다.그래서 몇 가지 좋은 제안을 받고 코드를 다음과 같이 수정했습니다.
<html>
<head>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load('jquery', '1.4.2');
google.load('jqueryui', '1.7.2');
</script>
<script type="text/javascript">
setTimeout(testJunk,1000);
function testJunk() {
$.ajax({ url: 'http://xxxxxxxxxxxxxx/test', // The url returns an empty string
dataType: 'html',
success: function(data){setTimeout(testJunk,1000)}
});
}
</script>
</head>
<body>
Why is memory usage going up?
</body>
</html>
그래도 별 차이가 없는 것 같았어.DOM으로 아무것도 하지 않고 Ajax 콜을 코멘트하면 메모리 누수가 멈춥니다.그럼 유출은 전적으로 에이잭스의 전화인 것 같네요jQuery Ajax는 기본적으로 순환 참조를 생성합니까? 그렇다면 어떻게 하면 참조를 해제할 수 있습니까?참고로 파이어폭스에서는 유출되지 않습니다.
다른 VM에서 테스트를 실행하여 결과가 동일한지 확인할 것을 제안받았습니다.다른 VM을 설정하지 않고 Internet Explorer 8을 탑재한 XP Home을 실행하고 있는 노트북을 찾았습니다.같은 문제를 나타내고 있습니다.
이전 버전의 jQuery를 사용해 보다 나은 결과를 얻었지만, 문제는 완전히 사라지지 않고 jQuery에서 Ajax를 포기하고 좀 더 전통적인(그리고 못생긴) Ajax를 선택하게 되었습니다.
다음은 jQuery 1.4.2의 권장 수정 프로그램과 함께 jQuery의 버그에 대한 링크입니다.
--- jquery-1.4.2.js 2010-04-08 12:10:20.000000000 -0700
+++ jquery-1.4.2.js.fixed 2010-04-08 12:10:38.000000000 -0700
@@ -5219,7 +5219,7 @@
// Stop memory leaks
if ( s.async ) {
- xhr = null;
+ xhr.onreadystatechange = null; xhr.abort = null; xhr = null;
}
}
};
메모: 이것은 jQuery 1.4.4에서 공식적으로 수정되었으므로 지금 바로 업그레이드하는 것이 가장 좋습니다.
Internet Explorer의 jQuery 1.4에서 문제가 발생하지만 버전 1.2 및 1.3에서는 문제가 발생하지 않습니다.
1.4.0, 1.4.1 및 1.4.2는 모두 메모리 누수가 심각합니다.
1.2.3, 1.2.6, 1.3.0, 1.3.1 및 1.3.2는 모두 훨씬 작은 누출(10분 후 약 100KB)을 보였습니다.
또, 보다 전통적인 방법으로 Ajax를 호출하는 프로그램의 버전도 시험해 보았습니다.
<html>
<head>
<script language="javascript" type="text/javascript">
function getHTTPObject() {
var xmlhttp;
/*@cc_on
@if (@_jscript_version >= 5)
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
@else
xmlhttp = false;
@end @*/
if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
try {
xmlhttp = new XMLHttpRequest();
if (xmlhttp.overrideMimeType) {
xmlhttp.overrideMimeType("text/xml");
}
} catch (e) {
xmlhttp = false;
}
}
return xmlhttp;
}
var ajaxObject = getHTTPObject();
setTimeout(testJunk,1000);
function testJunk() {
ajaxObject.open('POST', 'http://XXXXXXXXXXXXXXX/delme2', true);
ajaxObject.onreadystatechange = handleAjaxResponse;
ajaxObject.send(null);
}
function handleAjaxResponse() {
if (ajaxObject.readyState==4) {
setTimeout(testJunk,1000);
}
}
</script>
</head>
<body>
<div id="test">Why is memory usage going up?</div>
</body>
</html>
이것으로 누수가 완전히 없어졌다.
JQUery people이 이 문제를 해결할 때까지 Ajax를 반복 호출해야 할 것 같습니다.
몇 분 전까지만 해도.는 을 했을 때 입니다.onreadystatechange
는 ie ie, IE 는는만만만만똑 ie ie ie ie ie ie ie ie ie ie.따라서 해결책은 그것을 명시적으로 깨는 것입니다.단, 핸들러 자체에서는 할 수 없습니다(할 수 있으면 편리합니다).
매직 스테이트먼트:
delete request['onreadystatechange'];
으로 남길 요.XMLHttpRequest
「」를 .onreadystatechange
, 그 다음 readyState
4번으로 가서 마법으로 물건을 찍어주세요.이미 AJAX 폴링을 반복하고 있는 경우 청소 요구를 체크하는 논리적인 장소는 같은 폴링 루프 내에 있습니다.했습니다.RequestTracker
requestsobject 。
이것은 나에게 효과가 있었다; 나는 그것이 누출을 해결했다는 것을 증명했다.다음 링크에서는 특히 (더 많은 글을 올리고 싶지만 Stack Overflow에서는 허용되지 않습니다.)
eval()
확실히 메모리를 소비합니다(평가는 평가할 문자열을 setTimeout에 전달했을 때 발생합니다).이치노
setTimeout('testJunk()',1000);
다음 항목이어야 합니다.
setTimeout(testJunk, 1000);
또한 전체적으로 더 나은 용도는 다음과 같습니다.setInterval()
필요한 조작을 반복하는 경우는, 다음과 같이 시험해 주세요.
setInterval(testJunk, 1000);
코드의 문제 중 하나는 Ajax 요구가 시간이 걸리기 시작하면 브라우저와 서버에 Ajax 요구가 플래딩되기 시작할 때 브라우저가 서버에서 반환될 때까지 기다려야 한다는 것입니다.
function testJunk() {
$.ajax({ url: 'http://xxxxxxxxxxxxxx/test', // The url returns an empty string
dataType: 'html',
complete: function(data){
setTimeout(testJunk,1000);
}
});
}
testJunk();
본 적 있는데 메모리 유출 자체는 아닌 것 같아요다만 캐싱 때문에 Ajax 요청이 데이터 없이 반환됩니다.
다음과 같이 의도적인 캐시 제어 추가:
$.ajax({ url: 'http://xxxxxxxxxxxxxx/test', // The url returns an empty string
dataType: 'html',
cache: false,
success: function(data){}
});
setTimeout('testJunk()',1000)
캐싱과 XMLHttpRequest에서 특정 작업을 수행하며 jQuery는 기본적으로 캐시를 사용하지 않습니다.
저도 방금 이걸 접했어요.처음에는 UI 라이브러리와 관련이 있다고 생각했지만 사용하던 버전 1.4.2로 jQuery 1.5를 스왑한 후 사라졌습니다(1.4.4는 문제를 해결하지 못한 것 같습니다).
javascript에서 set interval을 사용하고 있는데 제대로 클리어하지 않으면 타이머가 여러 번 시작되어 콜 스택이 발생할 수 있습니다.
같은 것을 시도하다
var myVar = setInterval(function() { clear() }, 5000);
function clear() {
clearInterval(myVar);
GetData("ServiceLibrary","GetCalls",sdata,Complete);
};
언급URL : https://stackoverflow.com/questions/2429056/simple-jquery-ajax-call-leaks-memory-in-internet-explorer
'programing' 카테고리의 다른 글
Angular에서 속성 접두사 "x-" 및 "data-"는 어떻게 사용됩니까?JS (0) | 2023.03.18 |
---|---|
jquery를 사용하여 각 입력 값을 사용하여 동적으로 JSON 생성 (0) | 2023.03.18 |
핫 새로고침 시 프로세스가 정의되지 않음 (0) | 2023.03.13 |
woocommerce 감사 페이지의 헤드 태그에 javascript 코드를 삽입합니다. (0) | 2023.03.13 |
maven 프로젝트를 가져올 수 없습니다.Spring 응용 프로그램의 버전 속성(@Value) (0) | 2023.03.13 |