PHPスレッドのメモリ回収の問題

3644 ワード

PHPスレッドが終了すると、現在使用されているすべてのメモリ領域が破棄されます.では、このスレッドが終了しなければ、メモリをどのように回収しますか?
refcount:技術器を参照すると、その容器を指すポインタの数と理解できるでしょう.
is_ref:参照されるかどうか(0または1のみ)
割り当てられたプロセス:

 
 

参照プロセス:

 
 

何度も引用したらunsetが1つ落ちて、is_refがゼロにされるかどうか、それでバグが現れるのではないでしょうか.変数コンテナはやはり参照しましょう.では、以下を見てみましょう.

 
 

unsetと付与nullは変数を回収できますか?多くの人は、この2つが変数空間を回収できると勘違いしているが、実は間違っており、nullは変数が占有する空間を小さくしただけで、回収上、この容器は依然として存在している.

 
 

まとめ
1.ゴミ回収のタイミング
PHPで参照カウントが0の場合、メモリはすぐに解放されます.すなわち,リングリファレンスの変数は存在せず,変数の役割ドメインから離れ,メモリは直ちに解放される.リングリファレンス検出は一定の条件を満たすことでトリガーされるので,上記の例では使用メモリに大きな変動が見られる.gc_を通過することもできますcollect_cycles関数は,リングリファレンス検出をアクティブに行う.
2.&記号の影響
メモリの参照数を増やす変数を明示的に参照します.
$a = "something"; $b = &$a; この時点でunset($a)ですが、$bがメモリ領域を指す参照が残っており、メモリは解放されません.
3.unset関数の影響
unsetは、変数からメモリ領域への接続を切断するとともに、メモリ領域の参照カウント-1を切断するだけです.上記の例では、循環体内部、$a=new A();unset($a);$aの参照カウントをゼロに減らすことはありません.
4.=null操作の影響;
$a=nullは、$aが指すデータ構造を直接空にし、参照カウントを0にします.
5.スクリプト実行終了の影響
スクリプトの実行が終了すると、リファレンスループがあるかどうかにかかわらず、スクリプトで使用されているすべてのメモリが解放されます.