Tôi cần cập nhật nhiều dữ liệu trong một khoảng thời gian nhất định bằng JavaScript. Vấn đề là, không có vấn đề gì về thư viện JS tôi sử dụng (ngay cả js xương trần), rằng tất cả các trình duyệt dường như phân bổ bộ nhớ trên mọi yêu cầu AJAX và không thể giải phóng nó sau đó. Đây là một mẫu snipped rằng nên sao chép các lỗi:Trình duyệt tiếp tục ăn bộ nhớ với AJAX + setInterval
<!DOCTYPE html>
<html lang="en">
<head>
<title>Memleak Test</title>
<meta charset="utf-8" />
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
<script type="text/javascript">
function readData() {
$.getJSON('data.php');
}
$(document).ready(function() {
setInterval(readData, 1000);
});
</script>
</head>
<body>
<div id="content"></div>
</body>
</html>
Một trang kiểm tra tương đương có sẵn tại jsbin
Dưới đây là thông tin thêm về điều này:
- Tôi cũng đã cố gắng để đưa readData() chức năng như một đóng cửa trực tiếp trong cuộc gọi setInterval(). Điều này dường như không tạo ra bất kỳ sự khác biệt nào.
- Tôi sử dụng jQuery ở đây, nhưng bất kỳ Thư viện nào khác cũng sẽ tạo ra cùng một lỗi.
- Tập lệnh data.php của tôi chỉ tạo JSON-Object giả với json_encode() bằng PHP.
- Tôi biết rằng một giây là khung thời gian ngắn ở đây, trong kịch bản sản xuất của tôi, khung thời gian là 30 giây. Tôi chỉ muốn nhìn thấy hiệu ứng nhanh hơn (trong ứng dụng sản xuất phải mất nhiều giờ nhưng sau đó bộ nhớ là đầy đủ quá).
- Vấn đề ở đây là ứng dụng sẽ mở 24/7.
Có vẻ đơn giản đến mức tôi nghĩ mình đang làm điều gì đó sai ở đây, sẽ rất tuyệt nếu một số chuyên gia JS ở đây có thể giúp tôi!
Trong * kiểm tra * thực sự của bạn được bạn thao tác DOM, qua '.html' hay? – karim79
karim79, trong môi trường sản xuất của tôi tất nhiên tôi thao tác DOM. Khi tôi cố gắng để theo dõi vấn đề, tôi có thể thu hẹp nó xuống để gọi ajax và ngạc nhiên của tôi này "rò rỉ" cũng xảy ra mà không cần bất kỳ thao tác DOM. Tôi cho rằng trình duyệt không thể giải phóng bộ nhớ được cấp phát bên trong cuộc gọi setIntervall, nhưng tôi không biết cách làm việc đó. – daschl
Điều gì sẽ xảy ra nếu bạn thay đổi nó để mỗi yêu cầu N, nó làm mới trang trình duyệt thay vì thực hiện cuộc gọi AJAX? – notJim