Edit report at http://bugs.php.net/bug.php?id=55033&edit=1

 ID:                 55033
 Comment by:         rodney dot rehm at medialize dot de
 Reported by:        rodney dot rehm at medialize dot de
 Summary:            Memory Leak in magic method __get() [Zend Memory
                     Manager]
 Status:             Bogus
 Type:               Bug
 Package:            Performance problem
 Operating System:   Mac OS X 10.6.7
 PHP Version:        5.3.6
 Block user comment: N
 Private report:     N

 New Comment:

Well, I figure since Bug #48197 is still open, the issue will be resolved 
eventually. 



If you're facing memory problems because of __get() you might want to 
sporadically clone the object: $object = clone $object; The wasted memory is 
not cloned. Beware that you are trading memory for runtime. Only consider this 
if you are facing memory issues or runtime is not an issue.


Previous Comments:
------------------------------------------------------------------------
[2011-06-11 17:42:22] rodney dot rehm at medialize dot de

Just to get this straight. This is not a bug, it's expected behavior.



Anything returned from a magic method is internally handled as a copy. That 
means that anything a magic methods returns, even if it's a reference to 
another object, is kept in memory. That is, until the $object the magic methods 
were invoked on, is unset().



Are you kidding me? Not a bug? Where is this not a bug?

A note on this topic wouldn't harm the docs, you know?

------------------------------------------------------------------------
[2011-06-11 17:02:32] [email protected]

A copy of returned variable is done.

------------------------------------------------------------------------
[2011-06-11 17:01:14] rodney dot rehm at medialize dot de

What exactly do you mean by "separating return from __get()"? The memory is 
pumped regardless of how I return (value, reference). How am I supposed to 
"separate" here?

------------------------------------------------------------------------
[2011-06-11 16:48:14] [email protected]

There is no memleak, what happens is that the return from __get() needs to be 
separated.

See bug #48197

------------------------------------------------------------------------
[2011-06-11 14:40:52] rodney dot rehm at medialize dot de

Description:
------------
For some reason values returned by __get() aren't released from memory.



$ php memory.php      # (without --debug)

0.0096 seconds and 1.3461 MB for 10000 accessing known property



$ php memory.php      # (with --debug)

0.0317 seconds and 2.6435 MB for 10000 accessing known property



$ export USE_ZEND_ALLOC=0

$ php memory.php      # (with --debug)

0.0267 seconds and 0.0000 MB for 10000 accessing known property





since disabling Zend Memory Manager solved the issue, the valgrind log is 
pretty much useless, thus not attached.

Test script:
---------------
<?php



class Memleak

{

    public function __get($name)

    {

        return "hello world";

    }

}



$iterations = 10000;

$foo = new Memleak();



$start = microtime(true);

$mem = memory_get_usage();



for ($i=0; $i < $iterations; $i++) {

    $foo->{'bar' . $i};

}



$_mem = memory_get_usage();

$_start = microtime(true);

printf("%0.4f seconds and %0.4f MB for %d accessing known property\n", $_start 
- $start, ($_mem - $mem) / 1024 / 1024, $iterations);



?>

Expected result:
----------------
0.0099 seconds and 0.0000 MB for 10000 accessing known property

Actual result:
--------------
0.0099 seconds and 1.3460 MB for 10000 accessing known property


------------------------------------------------------------------------



-- 
Edit this bug report at http://bugs.php.net/bug.php?id=55033&edit=1

Reply via email to