Ich war gestern Teilnehmer an einer kleinen Diskussion zum Thema Garbage Collection in PHP. Im Gegensatz zu z.B. JAVA verwendet PHP einfaches Reference Counting um zu ermitteln, welche Speicherbereiche nicht mehr benötigt werden. Wenn sich nun aber Objekte gegenseitig referenzieren – auch gerne über sehr viele Zwischenobjekte – versagt diese Strategie letztendlich.
Das ist ganz klar ein Schwachpunkt gegenüber z.B. JAVA, wo es auch GC Strategien gibt. Ich fand meine Reaktion darauf aber ganz interessant. Das Problem wurde nämlich anhand einer doppelt verketteten Liste erläutert und mein erster Gedanke war: wo ist das Problem? Eine solche Liste sollte doch mit Klassen implementiert werden und dann muss halt der Destructor der Liste dafür sorgen, dass alle Elemente darin gelöscht werden.
Als Gegenargument kam dann, dass der Destructor ja nicht zwangsläufig aufgerufen werden muss. Was natürlich stimmt und was ja auch überhaupt erst eine Garbage Collection notwendig macht. Meine frühen Erfahrungen mit C/C++ haben mich aber so sehr darauf getrimmt, immer schön aufzupassen, was ich mit meinem allokierten Speicher mache, dass ich dieses Verhalten auch auf PHP übertragen habe.
Bei PHP kommt ja nun noch hinzu, dass es meisten in einer Webumgebung eingesetzt wird und somit nur ein kurzlebiger Prozess abläuft. Da wird es in den meisten Fällen keinen Unterschied machen, ob zwischendurch die Garbage Collection aufräumt, oder das mit Ende des Prozesses vom Interpreter erledigt wird.
Sobald man PHP aber auch für lang laufende Aufgaben einsetzt. wie z.B. eigene Daemons, sollte man den Speicherverbrauch genau im Auge behalten.
Pingback: Const für Klassenmethoden in PHP « The Blog that never sleeps