Leak Problem

Viper2009

Erfahrenes Mitglied
Hallo,

Nach verzweifelter eifer, habe ich mich doch entschlossen mein Problem nieder zu schreiben.

Ich arbeite zurzeit an mehreren Projekten (JavaScript) die ich alle laden und darstellen muss.
Eins davon ist, dass einlesen von angefertigten Xml Dateien die dann durch die Walter Zorn Klasse gezeichnet werden.

Nun zum Problem, wenn ich dieses Zeichne freezt sich der Internet Explorer für einige Sekunden ein. Da fing mein Problem bereits an, alle Browser außer der Internet Explorer 7 liefen, nur bei 8 war ich schockiert es Funktionierte :).

Nach Stundenlangen starren in mein Quellcode ist mir aufgefallen, das sich die Freez time Linear zur Speicherverwaltung verhielt.

(Die Speicherverwaltung ist ein anderes Projekt wo mehrere Klassen im Array verwaltet werden.)

Bsp.
Klasse1: var Test, Test2… und var ArrayList -> Klasse2
Klasse2: var ZurKlasse1 -> Referenz von Klasse1

Wenn ich nun die Klasse2 die variable ZurKlasse1 auskommentiere ist die Geschwindigkeit um das 100fache schneller.

Wie kann ich dieses Problem am besten lösen ohne viel am Projekt zu ändern.


Mit freundlichen Grüßen
Viper
 
Erst einmal Danke für deine Antwort, dennoch muss ich sagen dass ich das Thema Memory Leak ausführlich durchgenommen haben.
Hoffe ich doch zumindest :p

Ich habe es so verstanden das ein Memory Leak erst nach verlassen der Seite auftritt, weil die Resourcen nicht freigegeben werden (gegenseitigen Verlinkung)…?

Ich bezweifle, das es am Dom des Internet Explorer 7 liegt.

Ich bin ja auch nur ein Mensch :D

//Edit: Nehme alles zurück, mein wissen über Memory Leak ist gering...
 
Zuletzt bearbeitet:
Achwas, diese paar mb (50MB), da lach ich doch drüber ;).
Ist schon erschreckend wie der IE arbeitet.

In irgendeiner meiner Projekte muss ein riesen Leak sein.
Wenn ich aber meine Projekte einzeln ausführe dann laufen alle Projekte reibungslos, nur in Kombination mit allen führt dies zu ein freez…
 
Beispiel Exemplar aus mein erstes Projekt (Variablennamen wurde geändert).

Code:
for (var i = 0; i < XX; i++)
{
	var loc_Objekt1 = new CIrgendEineKlasse ();
	
	loc_Objekt1.m_Variable1 = 120;
	loc_Objekt1.m_Variable2 = 50;
	
	loc_Objekt1.m_ArrayListe = new Array (); 
	var loc_ArrayListeVonKA = new Array (XXXX,XXX,....) //-> XXX sind KlassenObjekte
	
	for (var y = 0, len = loc_ArrayListeVonKA.length; y < len; y++)
	{
		var loc_Objekt2 = new CDieZweiteKlasse ();
	
		loc_Objekt2.m_Variable1 = loc_ArrayListeVonKA[y].XXX;
		loc_Objekt2.m_Variable2 = loc_ArrayListeVonKA[y].XXX;
	
		loc_Objekt2.m_Option = loc_Objekt1;
		loc_Objekt1.m_ArrayListe[y] = loc_Objekt2;
	}
	
	glob_ProduktListe[i] = loc_Objekt1;
}

Lade ich die beiden Projekte einzeln ist die Dauer für das erste ca. 0.4sec (OnBodyLoad) und das zweite hat eine Zeichnungsdauer von ca. 0.1sec.

Lade ich dann beide Projekte, obwohl das erste Projekt geladen wurde mit einer zeit von 0.4sec und die Datensätze wie im oberen Bsp. schon längst verarbeitet sind und die Zeichnung erst nach Benutzers Aufruf erscheint, dauert das Zeichnen dann 2.6sec.
Kommentiere ich folgende Zeile aus"loc_Objekt1.m_ArrayListe[y] = loc_Objekt2;" dauert das Zeichnen nur ca 0.1sec

Dieses wäre mir dann aber ein sehr komischer Memory Leak.

//Edit: Oder das Problem kommt aus der Walter Zorn Klasse
 
Zuletzt bearbeitet:
Problem wurde gefunden!

Zum einen hat der IE irgend welche DOM Probleme.... und zum anderen ist IE mist :D

folgendes getestet...

Code:
var loc_Array = new Array ();
for (var i = 0; i < 90000; i++)
{
    loc_Array[i] = new Array ();
}

blabla draw fillPolygon

Ich muss noch dazu sagen, dass ich "fillPolygon" (Walter Zorn) benutze.
Irgendwie braucht der IE Jahre bis der ein paar Routinen bearbeitet und das schöne ist je mehr Speicher der DOM verwaltet je langsamer wird er...

Würde gerne darüber weiter diskutieren.
 
Naja...das ist nicht nur im IE so, dass ein Array mit 90000 Elementen Speicher benötigt, irgendwo muss er ja hin :)

Bei Leaks geht es ja darum, dass Objekte, welche nicht mehr benötigt werden, weiterhin Speicher belegen.
Dein Problem hört sich eher danach an, als ob du zuviel Objekte erzeugst(welche dann im Speicher sind)...diese aber überhaupt nicht löschst.

Wenn es deine Anwendung erfordert, diese Objekte weiterhin zu Behalten, dann hast du in der Tat ein Problem, nicht nur im IE :-(

Es wäre auf jeden Fall hilfreicher, wenn du ein echtes Beispiel parat hättest, woran wir rumwerkeln können.:)
 
90000 war ein schlechtes Beispiel, aber 1000 Objekte einer Klasse werden es bestimmt sein.

Ich darf dies nur als gestrippt Version veröffentlichen oder Code Segmente. Die Sourcen sind für die Firma wo ich Arbeite.
Außerdem ist das Problem ja bekannt, es liegt an den Speicher von IE, je größer desto unstabiler.

Der Fehler kommt vom Speicher und die Walter Zorn Berechnungen der Polygons kriegen dadurch die freez time legs.

Die Berechnungen für die Polygons werden als string gespeichert so dass für ein Polygon je nach Koordinaten eine gestrippte Textlänge von 5k erhalte.
Beim Zeichnen (umkonvertierung) wird dann eine gesamt länge von ca. 32k in die Form oder div was auch immer geschrieben (<div style=\"overflow:hidden;position:absolute;background-color:#123456;left:27px;top:0px;width:374px;height:1px\">...).

Und ich denke, dass es dann dadurch zum leak kommt.

Hier was zum Testen, so in etwa arbeitet mein Projekt. Nur komplexer. Die Walter Zorn Klasse kann man HIER LADEN
Code:
function Klasse1 ()
{
    this.Variable1 = null;
    this.Liste = new Array ();
}

function Klasse2 ()
{
    this.Variable1 = null;
    this.ZurKlasse1 = null;
}

var glob_Array = new Array ();
for (var i = 0; i < 1000; i++)
{
    var A = new Klasse1 ();

    A.Variable1 = 50;

    for (var t = 0 ; t < 20; t++)
    {
        var B = new Klasse2 ();
        
        B.Variable1 = 99;
        B.ZurKlasse1 = A;
        
        A.Liste[t] = B;
    }
    glob_Array[i] = A;
}

Funktion WennBodyFertigGeladenIst ()
{
    var Graphic = new jsGraphics ("sticky_right");
    a.setColor ("#123456");
    
    for (var i = 0; i < 3; i++)
    {
        var loc_ArrayX = new Array (30,397,400,403,406,409,412,415,418,418,421,423,424,426,426,427,427,427,427,426,426,424,423,421,418,418,415,412,409,406,403,400,397,30,27,24,21,18,15,12,9,9,6,4,3,1,1,0,0,0,0,1,1,3,4,6,9,9,12,15,18,21,24,27,30);
        var loc_ArrayY = new Array (0,0,0,1,1,3,4,6,9,9,12,15,18,21,24,27,30,240,243,246,249,252,255,258,261,261,264,266,267,269,269,270,270,270,270,269,269,267,266,264,261,261,258,255,252,249,246,243,240,30,27,24,21,18,15,12,9,9,6,4,3,1,1,0,0);
        Graphic.fillPolygon (loc_ArrayX, loc_ArrayY);
    }
        
    Graphic.paint ();
}

//Edit: Jetzt werden nur 3 Objekte gezeichnet bei mir sind es etwa 10, von Line bis zum Text.
 
Zuletzt bearbeitet:
Also nochmal....mit Leaks hat das nichts zu Tun :)

Ein Leak wäre, wenn der IE Speicher, der bspw. für eine Objekt, welches du gelöscht hast, nicht freigibt, was nicht der Fall ist....du löschst da ja nichts.

Die Browser haben halt alle ihre eigene Technik...die vom IE8 ist anscheinend für deine Anwendung vorteilhafter als die von den Vorgängern.
Was du daraus lernen kannst:
Haushalte besser mit den Ressourcen und lösche Sachen, die du nicht benötigst.
 
Zurück