Bug #79392 [Opn]: get_object_vars() memory leak
| From: | tomas914 at gmail dot com | Date: | Wed, 18 Mar 2020 12:05:56 +0000 |
| Subject: | Bug #79392 [Opn]: get_object_vars() memory leak | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-226149@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=79392&edit=1
ID: 79392
User updated by: tomas914 at gmail dot com
Reported by: tomas914 at gmail dot com
Summary: get_object_vars() memory leak
Status: Open
Type: Bug
Package: Performance problem
Operating System: Windows 10
PHP Version: Irrelevant
Block user comment: N
Private report: N
New Comment:
Issue is present in all PHP versions since at least 7.0, didn't test earlier ones.
Previous Comments:
------------------------------------------------------------------------
[2020-03-18 12:01:03] tomas914 at gmail dot com
Description:
------------
I'm developing an app which uses storage with fairly large amount of objects that are created
from unserialized cached data.
Objects properties are set by iterating through get_object_vars() which causes extremely high memory
usage.
Provided is reduced test case for reproducing this issue. The difference between two create
functions is only the amount of get_object_vars() calls which leads me to conclusion it's a
memory leak.
Results are:
Create(): Memory usage: 28.72MB
CreateWithLeak(): Memory usage: 95.1MB
Test script:
---------------
abstract class ObjectVarsCache
{
public static $vars = array();
}
class Test
{
public $a;
public $b;
public $c;
public $d;
public $e;
public $f;
public $g;
public $h;
public $i;
public $j;
public function CreateWithLeak()
{
$vars = get_object_vars($this);
}
public function Create()
{
$vars = &ObjectVarsCache::$vars;
if (!$vars)
$vars = get_object_vars($this);
}
}
$objects = array();
for ($i = 0; $i < 100000; ++$i)
{
$object = new Test;
//$object->Create(); // uncomment to compare
$object->CreateWithLeak();
$objects []= $object;
}
echo "Memory usage: ".round(memory_get_usage() / 1024 / 1024, 2)."MB, Peak memory
usage: ".round(memory_get_peak_usage() / 1024 / 1024, 2)."MB";
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=79392&edit=1