3

私は 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";

は:

Start: 122000
Person object: 122096
Hello, World!
After call: 122096
After unset: 122000

予想通り。オブジェクトを割り当てた後、メモリが増加しますが、メソッド呼び出しが終了してオブジェクトが設定解除されると、通常に戻ります。コードを次のように変更すると、次のようになります。

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

使用したすべてのメモリを解放できないのはなぜですか? 私はPHP 5.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
4

1 に答える 1

3

unset() によってメモリが解放されると、これは自動的に memory_get_usage() に反映されません。メモリは未使用で、再利用できます。しかし、未使用のメモリが実際に削減されるのは、ガベージ コレクション ルーチンが開始された後です。

于 2012-12-16T17:37:17.503 に答える