Chart Widget Memleak?

Begonnen von Waldmensch, 11 Juli 2019, 08:51:03

Vorheriges Thema - Nächstes Thema

Waldmensch

Ich habe schon immer das Problem, das FTUI nach einer Weile crasht, egal ob in Fully oder im Chrome auf dem Desktop. Wenn man in den Chrome DevTools mal Heap Snapshots macht und vergleicht, sieht man, dass der Speicherverbrauch nur in eine Richtung geht und das ist nach oben. Nach einer Weile sieht man da "Millionen" Arrays, die aus dem Chart widget zu kommen scheinen. Im Screenshot sieht man 3 Snapshots ca. mit 5 Minuten Abstand gemacht. Irgendwann, nach so 12 Stunden ist beim Chrome "Ende Gelände" und die Seite hängt sich auf. Wenn ich weitere infos/tests liefern kann/soll, einfach Bescheid sagen.

- Im Chart Widget Script steht oben /* Version 2.8.1
- debug ist auf 0
- code des widget:
<div
data-type="chart"
data-uaxis='["secondary","primary","primary"]'
data-device ="Wechselrichter1"
data-get ="ProdTotal"
data-logfile="HISTORY"
data-logdevice='["logdb","logdb","logdb"]'
data-columnspec='["Solarwatt:Bat_SoC","Wechselrichter1:EV","Wechselrichter1:ProdTotal"]'
data-style='["ftui l4","ftui l2fill","ftui l1fill"]'
data-minvalue="0"
data-minvalue_sec="0"
data-maxvalue="10000"
data-maxvalue_sec = "100"
data-height="110"
data-width="420"
class="left nobuttons">
</div>





Waldmensch

Ich habe mal die beiden Prototypen sum() und clone() aus dem Array entfernt und in separate Funktionen gepackt (+ den restlichen Code entsprechend angepasst). Das sieht gefühlt schon ganz anders aus in der Timeline. Ich denke mal, in der Richtung muss man suchen.

function cloneArray(arr, reverse) {
var i, copy;

if (Array.isArray(arr)) {
copy = arr.slice(0);
//for(i=0; i < copy.length; i++) {
// copy[i] = Array.isArray(copy[i])?copy[i].clone():copy[i];
//}
return reverse?copy.reverse():copy;
} else if((typeof arr === 'object') && arr!==null) {
throw 'Cannot clone array containing an object!';
} else {
return reverse?arr.reverse():arr;
}
};

function sumArray(arr, in_start,in_end) {
var start = in_start!==undefined?in_start:0;
var end = in_end!==undefined?in_end+1:arr.length;
start = Math.min(start,end);
end = Math.max(start,end);
var sum = 0;
for (var i=start; i<end; i++) {
if (arr[i]!==undefined) sum += arr[i];
}
return sum;
}

mumpitzstuff

Vielleicht solltest du die Quelle des Widgets angeben und nicht nur die Version. Es schwirren sehr viele unterschiedliche Versionen davon rum...

Waldmensch

Ich habe mal die timeline eine Weile laufen lassen. Wenn ich das richtig interpretiere werden die blauen Spikes, die da stehenbleiben, nicht vom GC weggeräumt. Das heißt, das da alle halbe Minute der Speicher über 1MB "aufgeblasen" wird. Das Objekt nennt sich "data_old"

@mumpitzstuff: die Version ist von hier: https://forum.fhem.de/index.php/topic,100412.msg938873.html#msg938873

Waldmensch

Keine Ahnung, ob ich damit etwas kaputtgemacht habe, aber wenn man in Zeile 5001 (das ist am Ende der drawChart funktion) ein data_old = null; einfügt, räumt der GC korrekt auf und der Speicherfraß ist beendet. Das ganze FTUI stagniert auf dauer bei 6,5MB. Das Chart wird normal angezeigt. Vor/zurück Buttons nutze ich im Chart nicht




Waldmensch

Hier nochmal nach 20! Minuten (da lag der Speicherverbrauch sonst schon bei 100MB)


mumpitzstuff

Poste doch deine Erkenntnisse direkt im betreffenden Thread. Ich denke dann kann der ein oder andere der dort Anwesenden auch noch was dazu beitragen.

Waldmensch

Ich habe diesen Thread dorthin verlinkt. Vielleicht kann @eki damit was anfangen. Mein FTUI läuft jetzt seit über 2h und ist immer noch bei 6,5MB Speicherverbrauch. Selbst wenn es letztlich anders gefixt wird, ist die Quelle des Übels schon mal gefunden.


Gesendet von iPhone mit Tapatalk

eki

Danke für die Inputs, ich schaue es mir an.