を呼び出すunset()
と、そのオブジェクトに関連付けられていたメモリが解放されますか? 大規模な連想配列を処理していて、完了したらそれらを削除したい場合がいくつかあります (新しい連想配列を作成するためにメモリを解放します)。
6 に答える
unset() を呼び出すと、そのオブジェクトに関連付けられていたメモリが解放されますか?
はい、そうです。
を使用して自分で確認してくださいmemory_get_usage()
:
echo memory_get_usage() . "<br />";
unset($array['key']);
unset($array['key2']);
unset($array['key3']);
echo memory_get_usage();
その他のリソース:
後のリンクから引用:
PHP は、次の 3 つの主要な時点でガベージ コレクションを実行します。
- それを伝えると
- 機能を終了するとき
- スクリプトが終了すると
状況 1 は、 unset()、 mysql_free_result() 、または変数の後で明示的にクリアするその他のリソース破壊関数を使用した場合に発生します。状況 2 はリソースを暗黙的にクリアします。つまり、スコープを離れる変数、つまり適用できなくなった変数はすべてクリアされます。最後に、状況 3 では、スクリプト関連のすべてのリソースが暗黙的に解放されます。
unset()
PHPでメモリを「解放」しますが、ガベージコレクタが実際にそのメモリをいつ解放するかを決定します。したがって、必要に応じて、または必要に応じて (PHP が使用可能なメモリを使い果たす前に) メモリが解放されます。
主な注意点はunset()
、ローカル スコープ内でグローバル変数を使用しようとしていないことに注意することです。unset
参照によって渡された変数でさえ、これが関数のロケールで実行される場合、ローカル参照のみを持ちます。本当にメモリを利用できるようにするunset()
には、その変数の適切なスコープですべてを行う必要があります。
いいえ、必ずしも何も解放されるわけではありません。参照カウントを減らすだけです。
例:
//object has reference count 1 because it has one variable referencing 1
$a = new BigObject;
//object still has reference count 2, but no new object was allocated in memory
$b = $a;
//object has reference count 1
unset($a);
//the object is still in memory
Nitpickコーナー:技術的には、ここでは2つの参照カウントが使用されています。オブジェクトとzvalです。オブジェクトの参照カウントは、プログラム全体で1つだけです。実際には、割り当てとへの呼び出しで変更されたzvalの参照カウントですunset
。
すぐにメモリを解放するわけではありませんが、ガベージ コレクターがそれを実行できるようにします。
変数の設定を解除すると、「refcount」が 0 に設定されます。これにより、Zend Engine がメモリ内で物事をシフトできるようになり、refcount が 0 であるため、メモリ内の変数領域を上書きできることがわかります。
これは、ガベージ コレクションが考えられる前に発生します。これで、 unset() はアプリのライフサイクル中に実際に役立ちます。
PHP >5.3.0 では、gc_collect_cycles()関数は既存のガベージ サイクルを強制的に収集します。