在这种情况下,PHP是否会泄漏内存?

在这种情况下,PHP是否会泄漏内存?,php,garbage-collection,Php,Garbage Collection,我正在学习PHP内存管理并运行一些代码示例。 此代码的输出 class Person { public function sayHello($who) { echo "Hello, $who!", "\n"; } } echo "Start: ", memory_get_usage(), "\n"; $person = new Person(); echo "Person object: ", memory_get_usage(), "\n";

我正在学习PHP内存管理并运行一些代码示例。 此代码的输出

class Person
{
    public function sayHello($who)
    {
            echo "Hello, $who!", "\n";
    }
}

echo "Start: ", memory_get_usage(), "\n";
$person = new Person();
echo "Person object: ", memory_get_usage(), "\n";
$person->sayHello("World");
echo "After call: ", memory_get_usage(), "\n";
unset($person);
echo "After unset: ", memory_get_usage(), "\n";
是:

正如所料。分配对象后,内存会增加,但在方法调用结束且对象未设置后,内存会恢复正常。 现在,如果我这样修改代码:

class Person
{
    public function sayHello($who)
    {
            echo "During call: ", memory_get_usage(), "\n";
            echo "Hello, $who!", "\n";
    }
}

echo "Start: ", memory_get_usage(), "\n";
$person = new Person();
echo "Person object: ", memory_get_usage(), "\n";
$person->sayHello("World");
echo "After call: ", memory_get_usage(), "\n";
unset($person);
echo "After unset: ", memory_get_usage(), "\n";
我得到:

Start: 122268
Person object: 122364
During call: 122408
Hello, World!
After call: 122380
After unset: 122284
为什么我不能释放所有我用过的记忆? 我使用的是PHP5.4:

PHP 5.4.9-4~oneiric+1 (cli) (built: Nov 30 2012 10:46:16) 
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
    with Xdebug v2.2.1, Copyright (c) 2002-2012, by Derick Rethans

当unset()释放内存时,这不会自动反映在内存\u get\u usage()中。内存未使用,可重复使用;但只有在垃圾收集例程启动后,未使用的内存才会真正减少。

只要在取消设置后再次尝试创建Person类的对象,您就会看到php如何重用内存;)尝试相同的测试,并添加内存使用率(true)以获得真正的使用率…“未使用的内存实际上减少了”-我在某个地方听说,由于碎片化,减少堆并不容易,php在脚本终止之前从不这样做。
PHP 5.4.9-4~oneiric+1 (cli) (built: Nov 30 2012 10:46:16) 
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
    with Xdebug v2.2.1, Copyright (c) 2002-2012, by Derick Rethans