phpbar.de logo

Mailinglisten-Archive

[php] Memory Hole?

[php] Memory Hole?

Björn Goetschke jabba at jabbahome.de
Mon Mai 18 17:22:57 CEST 2009


Hi Stefan,

ich schätze das Problem wird dadurch hervorgerufen, dass sich die beiden 
Objekte "tubu" und "bar" jeweils gegenseitig referenzieren.

Im Normalfall entfernt der Garbage-Collector Objekte, die nicht mehr 
gebraucht werden - sprich: auf die keine Refernz mehr existiert.

Da die beiden Objekte sich allerdings gegenseitig referenzieren, wird 
bei keinem von beiden der Referenz-Zähler jemals auf 0 fallen.

Deswegen funktioniert es auch wenn du ein "clone" verwendest.
Dadurch verbrauchst du zwar in einem Schleifendurchlauf mehr Speicher 
(für das geklonte Objekt), aber konstruierst keine Schleife durch deine 
Referenzen.


In wie weit das so gedacht ist kann ich nicht beurteilen.
Ich hätte erwartet das der Garbage-Collector Gruppen von Objekten, die 
nur noch sich selbst untereinander referenzieren, erkennt und aus dem 
Speicher entfernt. Aber wahrscheinlich ist das nicht ganz so einfach zu 
implementieren, wie das jetzt hier zu schreiben ;)


Gruß
Björn

Stefan Sturm wrote:
> Hallo,
> 
> wir habe in einem größeren Projekt derzeit ein Problem mit dem
> Speicherverbrauch eines Scripts.
> Ich habe das Problem in einem kleineres Script reproduzieren können.
> Aber vielleicht ist das ja auch ein Feature.
> 
> Hier das Script:
> 
> [...]
> 
> Dieses Script frisst bei jedem Druchlauf mehr Speicher.
> Wenn ich in der Function init() in Klasse bar folgende Zeile verwende
> ist alles OK.
> $this->list[] = new tubu(clone $this); // ein clone vor das $this.
> 
> Hat da jemand vielleicht eine Idee?
> 
> Danke und Grüße,
> Stefan Sturm

-- 
Björn Goetschke

http://www.bjoern-goetschke.de/
http://www.jabbahome.de/

php::bar PHP Wiki   -   Listenarchive