2015-12-22 23 views
12

Tôi có một Biểu đồ đường sống mà cập nhật thường xuyên, xem http://jsfiddle.net/cddw17fg/5/bộ nhớ ứng dụng nvd3 rò rỉ

function redraw() { 
    if (!redraw.isGraphShown) { 
    redraw.isGraphShown = true; 
    ... 
    } else { 
    d3.select('#chart svg') 
     .datum(data) 
     .transition().duration(1500) 
     .call(chart); 

    d3.select('.nv-x.nv-axis > g').selectAll('g').selectAll('text') 
     .attr('transform', function(d, i, j) { 
     return 'translate (-40, 40) rotate(315)' 
    }); 
    nv.tooltip.cleanup(); 
    chart.update(); 
    } 
} 

Chạy này js trong IE11 với "Công cụ phát triển" các "Tổng bộ nhớ" tăng nhẹ đầu tiên, nhưng sau vài phút nó bắt đầu phát triển nhanh.

Sau khi khởi động jsfiddle tiêu thụ bộ nhớ vẻ 'tốt' ... after startup nhưng sau vài phút có người bị đói và ăn byte của tôi ... starting to eat memory

Bất cứ ai bất cứ manh mối về những gì tôi đang làm sai rồi?

+1

thử với phiên bản mới nhất 1.8.1 tại http://jsfiddle.net/3va0m0e4/2/, trông giống như cùng một vấn đề xuất hiện trong chrome –

Trả lời

1

Tôi giữ cho bạn fiddle chạy trong 30 phút trên một trong các tab chrome trong khi tôi làm việc trên một cái gì đó khác và nó bị rơi.

Tuy nhiên nếu tôi tiếp tục mở tab sao cho tab không bao giờ mất tiêu điểm, nó sẽ không bao giờ bị treo và tiếp tục hoạt động liên tục.

Vì vậy, tôi giả định rằng nvd3 không cập nhật biểu đồ nhưng giữ tất cả cập nhật trong bộ sưu tập khi tab ở trạng thái mờ đó là lý do bộ nhớ tiếp tục tăng. Bây giờ khi tiêu điểm trở lại trên tab, nó cố gắng hiển thị tất cả các cập nhật và màn hình bị đóng băng và cuối cùng bị treo.

Bây giờ là một sửa chữa:

Tôi đang sử dụng jQuery để phát hiện các cửa sổ trên tập trung:

$(window).focus(function() { 
    window_focus = true;//set this flag on 
}).blur(function() { 
    window_focus = false;//set this flag off as window is not in display 
}); 

Bây giờ bên trong của bạn redraw function làm cập nhật bảng xếp hạng chỉ khi cửa sổ được lấy nét:

if(window_focus){ 
      chart.update(); 
      d3.select('#chart svg') 
       .datum(data) 
       //.transition().duration(1500) 
       .call(chart); 

      d3.select('.nv-x.nv-axis > g').selectAll('g').selectAll('text') 
       .attr('transform', function(d, i, j) { 
        return 'translate (-40, 40) rotate(315)' 
       }); 
      nv.tooltip.cleanup(); 

     } 

Mã làm việc here

Hy vọng điều này sẽ giúp bạn!

+0

Tôi chỉ cố gắng jsfiddle bạn sử dụng IE11 và tôi đạt 3,6 GB Tổng số bộ nhớ sau 15 phút - vẫn đang phát triển ... Biểu đồ đã bị ẩn bởi một tab khác trong thời gian này. Rất tiếc, tôi không thể thêm ảnh chụp màn hình vào nhận xét này) – Mario

+0

OK tiếc là tôi không có IE ... vì vậy bạn có thể kiểm tra trong bảng điều khiển nếu bạn có thể thấy "Không được gọi" khi bạn chạy http://jsfiddle.net này/y3d5wdof/1/và thay đổi tập trung vào một số tab khác – Cyril

+0

xin lỗi thử này fiddle http://jsfiddle.net/cyril123/y3d5wdof/3/ và xem nếu nó hoạt động! – Cyril

0

Dường như là lỗi trong chính NVD3 hoặc D3. Cách giải quyết của tôi bây giờ là tải lại trang với sơ đồ cứ 10 phút một lần.

var startDateNVD3Reload = Date.now(); 
... 
var elapsed_time_minutes = (Date.now() - startDateNVD3Reload)/1000/60; 
if (elapsed_time_minutes > 10) 
{ 
    location.reload(true); 
}