2015-12-22 12 views
12

ich einen lebenden Liniendiagramm, die häufig aktualisiert, leicht ersten http://jsfiddle.net/cddw17fg/5/nvd3 Anwendung eines Speicherleck

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(); 
    } 
} 

Ausführen dieses js in IE11 mit den „Development Tool“ der „Gesamtspeicher“ erhöht, aber nach einigen Minuten ist es beginnt schnell zu wachsen.

Nach dem jsfiddle Start des Speicherverbrauch sieht ‚gut‘ ... after startup aber nach einigen Minuten jemand Hunger bekommt und esse mein Bytes ... starting to eat memory

Wer jede Ahnung, was ich tue falsch?

+1

mit neuester 1.8.1 Version auf http://jsfiddle.net/3va0m0e4/2/ Versuchte, sieht aus wie das gleiche Problem in Chrom erscheint –

Antwort

1

Ich hielt Sie Geige für 30 Minuten auf einem der Chrom Tabs laufen, während ich an etwas anderem arbeitete und es stürzte.

Allerdings, wenn ich die Registerkarte geöffnet, so dass die Registerkarte nie Fokus verliert es nie abstürzt und es funktioniert nahtlos weiter.

Also gehe ich davon aus, dass nvd3 das Diagramm nicht aktualisiert, sondern das gesamte Update in einer Sammlung behält, wenn sich der Tab im Unschärfebedingnis befindet, weshalb der Speicher weiter ansteigt. Jetzt, wenn der Fokus wieder auf der Registerkarte ist, versucht es alle Aktualisierungen zu rendern und der Bildschirm bleibt stehen und stürzt schließlich ab.

Jetzt als fix:

ich JQUERY bin mit dem Fenster auf Fokus erkennen:

$(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 
}); 

Jetzt in Ihrem redraw function nur Chart-Update tun, wenn das Fenster im Fokus ist:

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(); 

     } 

Arbeits Code here

Hoffe das hilft!

+0

ich Ihren jsfiddle gerade versucht IE11 mit und ich erreichte 3,6 GB Gesamtspeicher nach 15 Minuten - immer noch wachsend ... Die Karte wurde während dieser Zeit von einem anderen Tab versteckt. (Leider kann ich den Screenshot zu diesem Kommentar nicht hinzufügen) – Mario

+0

OK, leider habe ich keinen IE ... also kannst du in der Konsole nachsehen, wenn du "Nicht aufgerufen" siehst, wenn du dieses http://jsfiddle.net ausführst/y3d5wdof/1/und ändere den Fokus auf einen anderen Tab. – Cyril

+0

Entschuldigung, versuch diese Geige http://jsfiddle.net/cyril123/y3d5wdof/3/ und schau ob es funktioniert! – Cyril

0

Es scheint ein Fehler in NVD3 oder D3 selbst zu sein. Meine Abhilfe besteht jetzt darin, die Seite mit dem Diagramm alle 10 Minuten neu zu laden.

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