我創建了一個網頁,每秒創建一次Ajax調用。在Internet Explorer 7中,它嚴重泄漏內存(大約15分鐘內20 MB)。簡單的jQuery Ajax調用在Internet Explorer中泄漏內存
該程序非常簡單。它只是運行一個可以進行Ajax調用的JavaScript函數。服務器返回一個空字符串,而JavaScript代碼不做任何事情。我使用setTimeout
來每秒運行該功能,並且我正在使用Drip來觀察此事。
這裏是源:
<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調用,內存泄漏就會停止。所以看起來泄漏完全在Ajax調用中。 jQuery Ajax是否固有地創建了某種循環引用,如果是這樣,我該如何釋放它?順便說一下,它不會在Firefox中泄漏。
有人建議在另一個虛擬機運行測試,看看結果是相同的。我找到了一臺運行Internet Explorer 8的XP Home的筆記本電腦,而不是設置另一臺虛擬機。它顯示了同樣的問題。
我嘗試了一些舊版本的jQuery,並獲得更好的結果,但直到我放棄了jQuery的Ajax和與更多的傳統(醜)阿賈克斯去的問題並沒有完全消失。
兼談答案很好奇 - 我有想法,但想知道結果。 – Plynx 2010-03-11 22:14:32
好問題,我不知道答案,但你可能會考慮在成功函數中使用setTimeout,所以如果你開始提出需要花費時間的請求,你不會重載服務器。如果您在發送下一個請求之前未收到來自服務器的全部響應,您將打開一個新的連接。 – MyGGaN 2010-03-11 22:20:36
感謝關於移動setTimeout的建議。我試過了,但沒有幫助。 – 2010-03-11 22:29:11