php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Request #33487 Memory allocated for objects created in object methods is not released
Submitted: 2005-06-27 11:31 UTC Modified: 2010-12-20 14:14 UTC
Votes:58
Avg. Score:4.5 ± 0.8
Reproduced:46 of 47 (97.9%)
Same Version:26 (56.5%)
Same OS:30 (65.2%)
From: robert dot munteanu at betbrain dot com Assigned: dmitry
Status: Assigned Package: Scripting Engine problem
PHP Version: * OS: *
Private report: No CVE-ID:
Have you experienced this issue?
Rate the importance of this bug to you:

 [2005-06-27 11:31 UTC] 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


Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2005-06-27 12:17 UTC] 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 15:29 UTC] 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
 [2006-01-26 19:56 UTC] 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
 [2010-12-20 14:14 UTC] jani@php.net
-Package: Feature/Change Request +Package: Scripting Engine problem -PHP Version: 6CVS-2005-06-27 +PHP Version: *
 
PHP Copyright © 2001-2014 The PHP Group
All rights reserved.
Last updated: Fri Apr 18 18:01:58 2014 UTC