2010-04-19 7 views
11

Ich überarbeite gerade das Objekt dispose Behandlung des qooxdoo JavaScript Frameworks.
Werfen Sie einen Blick auf das folgende Diagramm (A zur Zeit in Rahmen ist):Welche Speicherbereinigungsalgorithmen verwenden alle 5 wichtigsten Browser?

diagram http://yuml.me/51747906.jpg

Lassen Sie uns sagen, dass wir Allgemeinen B. löschen möchten, schneiden wir alle Verweise zwischen allen Objekten. Das bedeutet, dass wir im Beispiel die Verbindung 1 bis 5 trennen. Ist das wirklich notwendig?
Soweit ich gelesen habe, verwenden Browser den Mark-and-Sweep-Algorithmus. In diesem Fall müssen wir nur Referenz 1 (Verbindung zum Scope) und 5 (Verbindung zum DOM) trennen, was viel schneller sein könnte.
Aber kann ich sicher sein, dass alle Browser den Mark-and-Sweep-Algorithmus oder etwas ähnliches verwenden?

+0

Vielleicht sollten Sie uns sagen, was die 5 wichtigsten Browser _are_ in Ihrer Sicht sind. Sind sie IE6, IE7, IE8, FF3 und Safari zum Beispiel ?! –

+1

Mit 5 wichtigsten Browser meine ich FF (2, 3, 3,5, 3,6), Opera (9, 10, 10.5), Safari (3, 4), Chrome (2, 3, 4, 5) und IE (6, 7 , 8). –

Antwort

2

Für jeden vernünftigen Garbage Collector (nicht nur Mark-and-Sweep) würde die Verbindung 1 ausreichen, um B (und C und D und das Fenster) freizugeben. Eine Zuweisung basierend auf einer Referenzzählung würde B und D aufgrund ihrer zyklischen Referenzen nicht freigeben (B Referenzen D und D Referenzen B), aber Referenzzählung ist nicht wirklich eine Speicherbereinigung.

Ich denke, es ist sicher anzunehmen, dass alle Browser einen anständigen Garbage Collector verwenden (naja, mit Browsern ist nichts wirklich sicher, aber eine JavaScript Implementierung, die keinen richtigen Garbage Collector verwendet, ist trotzdem unwahrscheinlich).

+1

Die Referenzzählung reicht nicht aus, um die Garbage Collection zu implementieren, aber sie kann immer noch Teil eines anständigen GC sein. Wenn der Zählerstand 0 erreicht, wissen Sie positiv, dass Sie das Objekt sammeln können. Mit dieser Verknüpfung können Sie viele Objekte ohne einen aufwendigen Mark-and-Sweep-Schritt erfassen. Wenn die Zeit für einen Mark-and-Sweep-Vorgang eintrifft, bleibt weniger Müll übrig. – MSalters

+0

Referenzzählung ist teuer, wegen der Aktualisierungen der Zählungen (besonders in Bezug auf Cache). Asymptotisch ist Mark-and-Sweep auch ohne Zyklen weniger teuer als Referenzzählung. Das Referenzzählen interagiert jedoch in einigen Situationen besser mit virtuellem Speicher, weshalb Perl es verwendet (Perl glaubt an dynamische Bindungen durch Namen anstelle von Zeigern und erzeugt somit sehr wenige "wahre Zyklen"; Perl hat jedoch auch eine und-Sweep GC). –

2

Die Sache ist, dass Sie in einer idealen Welt nur DOM-Knoten und native Event-Listener trennen müssen. Problem ist jedoch, dass das ursprüngliche System in qooxdoo um fehlerhafte Browser wie IE6 herum entwickelt wurde. Wir haben den Speicherverbrauch massiv reduziert, wenn wir so viel wie möglich selbst löschen. In der heutigen Welt würde ich es jedoch so umgestalten, dass es in IE6 in Ordnung ist, aber nicht für seine Probleme optimiert ist.

Es gibt auch einen Unterschied von einer vollständigen Abschaltung der gesamten Anwendung (alle entsorgen) und nur einen Bruchteil einer Anwendung zu entsorgen. Im letzten Szenario müssen Sie sehr vorsichtig handeln, um nicht benötigte Dinge zu entsorgen.