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 +Status: Closed 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: This bug has been fixed in SVN. Snapshots of the sources are packaged every three hours; this change will be in the next snapshot. You can grab the snapshot at http://snaps.php.net/. Thank you for the report, and for helping us make PHP better. Previous Comments: ------------------------------------------------------------------------ [2010-04-20 14:30:38] dmi...@php.net Automatic comment from SVN on behalf of dmitry Revision: http://svn.php.net/viewvc/?view=revision&revision=298213 Log: Fixed bug #48781 (Cyclical garbage collector memory leak) ------------------------------------------------------------------------ [2010-04-19 12:37:21] rquadl...@php.net That should have said ... "So, it is _NOT_ completely losing the items, just not cleaning them during the cycle. At shutdown, they are cleaned." ------------------------------------------------------------------------ [2010-04-19 12:31:56] rquadl...@php.net If the loop is limited to 11111 items, using my code to report the construct/use/destruct, the log ends with ... 11108:#3 11109:#3 11110:#3 11111:#3 04999:#3 09999:#3 10000:#3 So, it is completely losing the items, just not cleaning them during the cycle. At shutdown, they are cleaned. ------------------------------------------------------------------------ [2010-04-19 12:27:12] rquadl...@php.net The gc cycle seems to miss the last 2 items on this cycle, but picks up from the last one for the next cycle, so is only actually dropping 1 item per cycle. My cycle goes something like this ... Create and assign #1 to #4999 Create #5000 Destroy #1 to #4998 Assign #5000 Create and assign #5001 to #9999 Create #10000 Destroy #5000 to #9998 --- Skipped #4999 Assign #10000 Create and assign #10001 to #14999 Create #15000 Destroy #10000 to #14998 --- Skipped #9999 etc. My code changes ... class User { protected $profile, $usercount; public function __construct ($usercount) { echo str_pad($this->usercount = $usercount, 5, '0', STR_PAD_LEFT), ':#1', PHP_EOL; $this->profile = new UserProfile($this); } public function __destruct() { echo str_pad($this->usercount, 5, '0', STR_PAD_LEFT), ':#3', PHP_EOL; } } class UserProfile { private $user; public function __construct ($user) { $this->user = $user; } } for ($userid = 1; ; $userid++) { $user = new User($userid); echo str_pad($userid, 5, '0', STR_PAD_LEFT), ':#2', PHP_EOL; // Same code as provided by Nate. ------------------------------------------------------------------------ [2010-04-19 09:54:39] dmi...@php.net 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. ------------------------------------------------------------------------ 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