|  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Doc Bug #79392 get_object_vars() memory leak
Submitted: 2020-03-18 12:01 UTC Modified: 2020-07-07 11:09 UTC
Avg. Score:5.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:0 (0.0%)
Same OS:0 (0.0%)
From: tomas914 at gmail dot com Assigned:
Status: Re-Opened Package: Performance problem
PHP Version: Irrelevant OS: Windows 10
Private report: No CVE-ID: None
View Add Comment Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
You can add a comment by following this link or if you reported this bug, you can edit this bug over here.
Block user comment
Status: Assign to:
Bug Type:
From: tomas914 at gmail dot com
New email:
PHP Version: OS:


 [2020-03-18 12:01 UTC] tomas914 at gmail dot com
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

    $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";


Add a Patch

Pull Requests

Add a Pull Request


AllCommentsChangesGit/SVN commitsRelated reports
 [2020-03-18 12:05 UTC] tomas914 at gmail dot com
Issue is present in all PHP versions since at least 7.0, didn't test earlier ones.
 [2020-03-18 14:14 UTC]
-Status: Open +Status: Not a bug -Assigned To: +Assigned To: cmb
 [2020-03-18 14:14 UTC]
The supposed "leak" is the properties table of the objects, which
is built lazily, because it is often not needed.  However,
get_object_vars() requires the table to be built, and it is only
freed when the object is destroyed.
 [2020-07-07 10:31 UTC] robert at korulczyk dot pl
This really should be documented at, since this is very surprising behavior. I have very similar use case where `get_object_vars($this)` was used in `toArray()` method. Finding source of memory usage increase took me 2-3 hours, because `get_object_vars()` was the last thing I suspected to leak. Especially that manually building this array does not affect memory usage.

No leak:

	public function toArray(): array {
		return [
			'a' => $this->a,
			'b' => $this->b,
			'c' => $this->c,
			'd' => $this->d,
			'e' => $this->e,
			'f' => $this->f,
			'g' => $this->g,
			'h' => $this->h,
			'i' => $this->i,
			'j' => $this->j,


	public function toArray(): array {
		return get_object_vars($this);
 [2020-07-07 11:09 UTC]
-Status: Not a bug +Status: Re-Opened -Type: Bug +Type: Documentation Problem -Assigned To: cmb +Assigned To:
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sun Mar 03 04:01:28 2024 UTC