2012-04-12 47 views
5

Tôi liên tục tìm nạp một đối tượng JSON từ máy chủ có các cuộc gọi AJAX. Theo thời gian, việc sử dụng bộ nhớ của trình duyệt tăng lên (đã thử với Chrome, Safari, Firefox). Sử dụng ảnh chụp nhanh heap của Chrome, tôi đã phát hiện ra rằng các chuỗi dấu thời gian đang được để lại xung quanh không có tham chiếu. Nếu tôi chụp một chuỗi ảnh chụp nhanh, tôi thấy số lượng Chuỗi liên tục tăng lên.Rò rỉ bộ nhớ với các yêu cầu AJAX + jQuery

$(function() { 
    var latestTimestamp = 0; 

    function fetchData() { 
     $.get("/parameter?format=json&since=" + latestTimestamp, gotData) 
    } 

    function gotData(data) { 
     latestTimestamp = data['timestamp']; 
     setTimeout(fetchData, 250); 
    } 

    fetchData(); 
}); 

ghi chú khác:

  • Tôi đang sử dụng jQuery 1.7.1. EDIT: Chỉ cần thử với 1.6.2 và 1.4.2, cùng một vấn đề.
  • timestamp trong đối tượng JSON thực sự là một số nguyên chứ không phải là một chuỗi. Vì vậy, các chuỗi tích lũy có thể là giá trị tạm thời?
  • Xóa + latestTimestamp khỏi yêu cầu AJAX sẽ ngừng rò rỉ.
  • Cài đặt thời gian chờ nhanh hơn (20ms) làm cho rò rỉ nhanh hơn. Tôi nghĩ rằng thời gian chờ nhanh có thể là để đổ lỗi, vì vậy tôi cắt nó trở lại 250ms, nhưng điều đó đã không giúp đỡ.
+1

@Vega fetchData là đã có trong mã;) (dòng 4) – Dave

+0

lẽ JQuery sẽ thích $ .get ("/ tham số", {định dạng: "json", vì: latestTimestamp}, gotData); – nikoshr

+0

@nikoshr Ý tưởng hay. Chỉ cần thử nó, nhưng nó vẫn rò rỉ. – Dave

Trả lời

0

Khi bạn đã thực hiện với dữ liệu [], bạn có thể thoát khỏi nó:

function gotData(data) { 
    latestTimestamp = data['timestamp']; 
    delete data; 
    setTimeout(fetchData, 250); 
} 
+0

Tôi đã thử lần này, nhưng ảnh chụp nhanh heap của Chrome vẫn hiển thị số chuỗi liên tục tăng giữa các ảnh chụp nhanh. – Dave

0

Tôi tin rằng vấn đề này nằm với jQuery và/hoặc các trình duyệt. Tôi đã nhìn thấy rò rỉ tương tự với các cuộc gọi AJAX thường.

Thay vì bỏ phiếu cho máy chủ 4 lần một giây, hãy xem xét đẩy dữ liệu từ máy chủ đến máy khách. Tôi không biết những gì nền tảng mà bạn đang sử dụng, nhưng nếu đó là Net bạn có thể muốn có một cái nhìn tại SignalR

https://github.com/SignalR/SignalR

http://www.hanselman.com/blog/AsynchronousScalableWebApplicationsWithRealtimePersistentLongrunningConnectionsWithSignalR.aspx

+0

Vâng, tôi không sử dụng. Net, và máy chủ tôi đang làm việc với tùy chỉnh và được viết bằng C++, nhưng có thể thực sự push server-to-client là thứ tôi nên xem xét. – Dave

0

Bạn đã thử cleartimeout chức năng javascript? nếu không, hãy thử điều này.

var abc=null; 
function gotData(data) { 
latestTimestamp = data['timestamp']; 
data=null; 
clearTimeout(abc); 
abc=setTimeout(fetchData, 250); 
}