Edit report at http://bugs.php.net/bug.php?id=48781&edit=1
ID: 48781 Updated by: dmi...@php.net Reported by: nate at frickenate dot com Summary: Cyclical garbage collector memory leak Status: Assigned Type: Bug Package: Scripting Engine problem Operating System: Debian 5.0 kernel 2.6.24-23-xen PHP Version: 5.3.0 Assigned To: dmitry New Comment: Yeah. I confirm the problem. It looks like on each 100,000 iterations PHP runs GC about 12 times. And on each GC run it looses 2 objects referenced by $user. I'll try to fix it. Previous Comments: ------------------------------------------------------------------------ [2010-04-18 02:28:35] j...@php.net I am unable to duplicate this behaviour using 5.3.2. The code given below consistently uses 0.65 MB even up to 10 million iterations - I pasted the output of up to 6 million, with the extended GC reporting turned on: <?php class User { protected $profile; public function __construct () { $this->profile = new UserProfile($this); } public function dispose() { $this->profile->dispose(); $this->profile = null; } } class UserProfile { private $user; public function __construct ($user) { $this->user = $user; } public function dispose() { $this->user = null; } } for ($userid = 1; ; $userid++) { if(isset($user)) { $user->dispose(); } $user = new User; if ($userid % 100000 == 0) printf("memory usage after %s users: %s MB.\n", number_format($userid), number_format(memory_get_usage() / 1024 / 1024, 2)); continue; } ?> memory usage after 100,000 users: 0.65 MB. memory usage after 200,000 users: 0.65 MB. memory usage after 300,000 users: 0.65 MB. [snip] memory usage after 5,700,000 users: 0.65 MB. memory usage after 5,800,000 users: 0.65 MB. memory usage after 5,900,000 users: 0.65 MB. GC Statistics ------------- Runs: 0 Collected: 0 Root buffer length: 0 Root buffer peak: 9 Possible Remove from Marked Root Buffered buffer grey -------- -------- ----------- ------ ZVAL 16 7 7 0 ZOBJ 77999984 11999998 11999998 0 ------------------------------------------------------------------------ [2010-01-05 19:31:01] nightstorm at tlen dot pl I confirm, there is a true memory leak. Consider the following script, where the references are unmounted manually with an extra dispose() method: ~~~~ <?php /* How to use: a) run test 1 by running code as-is b) run test 2 by commenting out test 1, uncomment test 2 c) run test 3 by commenting out test 1 & 2, uncomment test 3 */ class User { protected $profile; public function __construct () { $this->profile = new UserProfile($this); } public function dispose() { $this->profile->dispose(); $this->profile = null; } // end dispose(); } class UserProfile { private $user; public function __construct ($user) { $this->user = $user; } public function dispose() { $this->user = null; } // end dispose(); } for ($userid = 1; ; $userid++) { if(isset($user)) { $user->dispose(); } $user = new User; if ($userid % 100000 == 0) printf("memory usage after %s users: %s MB.\n", number_format($userid), number_format(memory_get_usage() / 1024 / 1024, 2)); continue; } ~~~~~ In this case the result is still the same (PHP 5.3.1): ~~~~ memory usage after 100,000 users: 0.61 MB. memory usage after 200,000 users: 0.61 MB. memory usage after 300,000 users: 0.61 MB. memory usage after 400,000 users: 0.61 MB. memory usage after 500,000 users: 0.61 MB. memory usage after 600,000 users: 0.61 MB. memory usage after 700,000 users: 0.61 MB. memory usage after 800,000 users: 0.61 MB. memory usage after 900,000 users: 0.61 MB. memory usage after 1,000,000 users: 0.61 MB. memory usage after 1,100,000 users: 0.61 MB. memory usage after 1,200,000 users: 0.61 MB. ~~~~ If we enable the garbage collector and remove the dispose() method, the used memory level begins to increase, and if we call gc_collect_cycles() after creating a new object, the used memory increases even much faster. On my PC, it is not able to perform display even a single control message after 100000 iterations. It stopped after approx. 33000 users: ~~~~ memory usage after 30,000 users: 25.37 MB. memory usage after 31,000 users: 26.07 MB. memory usage after 32,000 users: 26.76 MB. memory usage after 33,000 users: 31.46 MB. Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 89 bytes) in /home/me/test/memleak.php on line 17 ~~~~ ------------------------------------------------------------------------ [2009-12-15 01:00:00] php-bugs at lists dot php dot net No feedback was provided for this bug for over a week, so it is being suspended automatically. If you are able to provide the information that was originally requested, please do so and change the status of the bug back to "Open". ------------------------------------------------------------------------ [2009-12-08 15:23:16] nate at frickenate dot com No change, same problem. Considering this bug hasn't even been looked at or assigned, no surprise there. ------------------------------------------------------------------------ [2009-12-07 09:12:35] j...@php.net Please try using this snapshot: http://snaps.php.net/php5.3-latest.tar.gz For Windows: http://windows.php.net/snapshots/ ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/bug.php?id=48781 -- Edit this bug report at http://bugs.php.net/bug.php?id=48781&edit=1