Req #33487 [Asn]: Memory allocated for objects created in object methods is not released

From: Date: Wed, 27 Aug 2014 06:16:49 +0000
Subject: Req #33487 [Asn]: Memory allocated for objects created in object methods is not released
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-187288@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=33487&edit=1 ID: 33487 Updated by: dmitry@php.net Reported by: robert dot munteanu at betbrain dot com Summary: Memory allocated for objects created in object methods is not released Status: Assigned Type: Feature/Change Request Package: Scripting Engine problem Operating System: * PHP Version: * Assigned To: dmitry Block user comment: N Private report: N New Comment: This is not a bug, and it's not fixed. Previous Comments: ------------------------------------------------------------------------ [2014-08-26 18:55:41] chrisdmiddleton at gmail dot com Has this bug been fixed in PHP 5.*? ------------------------------------------------------------------------ [2006-01-26 19:56:32] nick at mythgaming dot net Note that the memory is freed inside php, just not yielded back to the operating system until execution ends. In this example, the memory is claimed as the function executes, then re-used when the function is run again (instead of using up twice as much memory): ---------- <?php function doNothing() { $res = array(); for ( $i = 0; $i < 20000; $i++) { $res[$i] = new StdClass; } } // Unix only function get_usage() { $my_pid = getmypid(); $usage = ps -eo%mem,rss,pid | grep $my_pid; $kb = preg_split("/\s+/", $usage); return sprintf("%.3f",$kb[2] / 1024) . "MB"; } echo "Before: ".get_usage()."\n"; doNothing(); echo "One Use: ".get_usage()."\n"; doNothing(); echo "Two Uses: ".get_usage()."\n"; ?> Output ------ Before: 5.555MB One Use: 10.164MB Two Uses: 10.293MB ------------------------------------------------------------------------ [2005-06-27 15:29:38] dmitry@php.net This is not really a bug, but unefficient usage of memory by zend_object_storage. It frees object buckets only on request shutdown. The test case allocates: 16384 * sizeof(zend_object_store_bucket) = 393216 bytes ------------------------------------------------------------------------ [2005-06-27 12:17:20] sniper@php.net Dmitry, is there any way to fix this..? (btw. unset() does NOT free all the memory..but that's, AFAIK, by design) ------------------------------------------------------------------------ [2005-06-27 11:31:02] robert dot munteanu at betbrain dot com Description: ------------ Whenever you create an object in a method, memory is not released when the method execution ends, unset() must be called manually. This becomes a problem when you have long-running scripts, which perform actions repeatedly which leads to the script running out of memory. Reproduce code: --------------- <?php class Tester { public function doNothing() { $res = array(); for ( $i = 0; $i < 10000; $i++) { $res[$i] = new StdClass; } } } $t = new Tester(); echo "Before: ".memory_get_usage()."\n"; $t->doNothing(); echo "After: ".memory_get_usage()."\n"; ?> Expected result: ---------------- Memory usage remains roughly the same. Actual result: -------------- Before: 41424 After: 432560 ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=33487&edit=1

« previous php.bugs (#187288) next »