Edit report at http://bugs.php.net/bug.php?id=52902&edit=1
ID: 52902 Comment by: jcampbell at remindermedia dot com Reported by: jcampbell at remindermedia dot com Summary: Recursive References Leak Memory Status: Bogus Type: Bug Package: Class/Object related Operating System: Fedora 12 PHP Version: 5.3.3 Block user comment: N New Comment: You're correct that it does form a cycle of memory usage going up and then back down. However, when using cloned objects, the memory usage is exactly the same after every loop. So if you make the objects larger so that a bunch of them don't fit under the memory limit but one does, then you'll run out of memory. Again, using cloned objects, you can loop indefinitely. Is the solution to this to manually run gc_collect_cycles() when dealing with large objects? Because that workaround does seem to have the same effect on memory as cloning. Previous Comments: ------------------------------------------------------------------------ [2010-09-21 21:32:10] cataphr...@php.net How is this leaking memory? Only <2MB for 2 million objects (A+B)? An object takes more than 1 byte... If you make the loop instantiate 10 times more objects, you see memory usage remains constant, so the garbage collection mechanism is definitely working here. ------------------------------------------------------------------------ [2010-09-21 21:20:05] jcampbell at remindermedia dot com Description: ------------ The behavior originally reported in #33595 still exists, namely, "Objects with recursive references leak memory." Test script: --------------- class A { function __construct () { $this->b = new B($this); } } class B { function __construct ($parent = NULL) { $this->parent = $parent; } } echo memory_get_usage() . "\n"; for ($i = 0 ; $i < 1000000 ; $i++) { $a = new A(); } echo memory_get_usage() . "\n"; Expected result: ---------------- Memory usage should remain relatively constant. For example, if you change the one line to: "$this->parent = clone $parent;" Then the output is: 632216 632392 Actual result: -------------- Memory usage increases with each newly instantiated object. Actual output: 631976 1756792 ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/bug.php?id=52902&edit=1