現在の言語: 日本語 |
ガベージコレクション |
メモリ解放関連 |
//循環参照の例
class test1
{
public object $data1;
}
class test2
{
public object $data2;
}
echo "<pre>";
//GCの自動実行を一時的に無効にします。
//循環参照が発生する環境を作ります。
gc_disable();
//循環参照をつくる準備をします
$cls1 = new test1();
$cls2 = new test2();
//お互いを参照させる(循環参照にsます)
//外部からの参照を解除します
//ここで $cls1と$cls2は外部からアクセスできなくなります。
//お互いに参照し合っているため、参照カウントはゼロになりません。
//この時点ではメモリは解放されず、リークした状態になります。
$cls1->data1 = $cls2;
$cls2->data2 = $cls1;
//unsetを実行して外部参照を切断します
//しかし、unsetを実行しても循環参照によりメモリは解放されません
unset($cls1);
unset($cls2);
//強制的にガベージコレクション(サイクル検出)を実行します
$count = gc_collect_cycles();
//2個の循環参照が収集され、メモリが解放されました。
echo $count . "個の循環参照が収集され、メモリが解放されました。\n";
//後片付けします
gc_enable();
echo "</pre>";
//Example of a circular reference
class test1
{
public object $data1;
}
class test2
{
public object $data2;
}
echo "<pre>";
//Temporarily disable automatic GC execution.
//Create an environment where a circular reference can occur.
gc_disable();
//Prepare to create a circular reference
$cls1 = new test1();
$cls2 = new test2();
//Make them reference each other (creating a circular reference)
//Remove external references
//Now, $cls1 and $cls2 can no longer be accessed externally.
//Because they still reference each other, the reference count will not reach zero.
//At this point, memory will not be released and will be leaked.
$cls1->data1 = $cls2;
$cls2->data2 = $cls1;
//Execute unset to break external references.
//However, executing unset does not free memory due to circular references.
unset($cls1);
unset($cls2);
//Force garbage collection (cycle detection).
$count = gc_collect_cycles();
//Two circular references were collected and memory was freed.
echo $count . "Circular references were collected and memory was freed.\n";
//Clean up.
gc_enable();
echo "</pre>";
| gc_enable() | ガベージコレクタ(サイクル検出メカニズム)の自動実行を有効にします。PHPの実行環境ではデフォルトで有効になっています。 |
| gc_disable() | ガベージコレクタ(サイクル検出メカニズム)の自動実行を無効にします。参照カウント自体は機能し続けますが、循環参照によるメモリリークが蓄積し始めます。 |
| gc_collect_cycles() | gc_disable()で無効な状態であっても、あるいは有効な状態であっても、その時点で強制的にサイクル検出とメモリ解放プロセスを実行します。 |
| 著作権情報 |
| ホームページおよプリ等に掲載されている情報等については、いかなる保障もいたしません。 ホームページおよびアプリ等を通じて入手したいかなる情報も複製、販売、出版または使用させたり、 または公開したりすることはできません。 当方は、ホームページおよびアプリ等を利用したいかなる理由によっての障害等が発生しても、 その結果ホームページおよびアプリ等を利用された本人または他の第三者が被った損害について 一切の責任を負わないものとします。 |