Tôi đã tạo một trang web thực hiện cuộc gọi Ajax mỗi giây. Trong Internet Explorer 7, nó bị rò rỉ bộ nhớ kém (20 MB trong khoảng 15 phút).Cuộc gọi jQuery Ajax đơn giản rò rỉ bộ nhớ trong Internet Explorer
Chương trình rất đơn giản. Nó chỉ chạy một hàm JavaScript thực hiện cuộc gọi Ajax. Máy chủ trả về một chuỗi rỗng và mã JavaScript không làm gì với nó. Tôi sử dụng setTimeout
để chạy các chức năng mỗi giây, và tôi đang sử dụng Drip để xem điều.
Dưới đây là nguồn:
<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>
Làm thế nào để cắm rò rỉ này? Tôi có một ứng dụng thực sự cập nhật một bảng lớn theo cách này, nhưng không được giám sát, nó sẽ chiếm tới hàng gigabyte bộ nhớ.
Sửa: okay, vì vậy sau khi một số gợi ý tốt, tôi sửa đổi mã để:
<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>
Nó dường như không thực hiện bất kỳ sự khác biệt, mặc dù. Tôi không làm bất cứ điều gì với DOM, và nếu tôi nhận xét về cuộc gọi Ajax, rò rỉ bộ nhớ sẽ dừng lại. Vì vậy, có vẻ như sự rò rỉ hoàn toàn trong cuộc gọi Ajax. Liệu jQuery Ajax vốn có tạo ra một dạng tham chiếu vòng tròn nào đó không, và nếu có, làm thế nào tôi có thể giải phóng nó? Nhân tiện, nó không bị rò rỉ trong Firefox.
Ai đó đã đề xuất chạy thử nghiệm trong một máy ảo khác và xem kết quả có giống nhau hay không. Thay vì thiết lập một máy ảo khác, tôi tìm thấy một máy tính xách tay đang chạy XP Home với Internet Explorer 8. Nó thể hiện cùng một vấn đề.
Tôi đã thử một số phiên bản cũ hơn của jQuery và có kết quả tốt hơn, nhưng vấn đề không biến mất hoàn toàn cho đến khi tôi bỏ Ajax trong jQuery và đi kèm với Ajax truyền thống (và xấu xí).
Cũng rất tò mò về câu trả lời - Tôi có ý tưởng, nhưng muốn biết kết quả. – Plynx
Câu hỏi hay, tôi không biết câu trả lời nhưng bạn có thể xem xét việc có setTimeout trong hàm thành công để bạn không bị quá tải máy chủ nếu bạn bắt đầu thực hiện các yêu cầu cần có thời gian. Trong trường hợp bạn không nhận được toàn bộ phản hồi từ máy chủ trước khi gửi yêu cầu tiếp theo, bạn sẽ mở một kết nối mới. – MyGGaN
Cảm ơn bạn đã đề xuất về việc di chuyển setTimeout. Tôi đã thử nó, nhưng nó không giúp được gì. –