PHP のガベコレについて

(LT) PHP のガベコレについて (小ネ
タ)
~PHP と refcount と copy on write~
2010年5月16日(日) yoya
GCの種類
• 参照カウント法
– 軽い。実装も軽いし動作も軽い、とくかく軽い
php-5.2.9/Zend/zend.h
refcount
GC処理
• zend_assign_to_variable (変数への代入処理)
古いデータの refcount を減らして 0 だったら廃棄
(dtor)
分かりやすい! 素晴らしい!!!
デメリット
• 「カウンタに多くのビットが必要」 (GC本p47)
• php-5.2.9/Zend/zend.h
• php-4.4.9/Zend/zend.h
PHP4での問題
• ushort :0 ~65535
– これだけあれば十分?
問題は、copy on write でも refcount を使っている
事
debug_zval_dump
• zval 構造体(全ての型の変数を統合して扱う
型)を dump するメソッド
↓ 実行結果
copy on write の罠
• 代入の時にコピーせず、値が更新(update ≒ on write)され
た時にコピー(copy)する方式。
• for ループ
• $x をオブジェクト参照だとすれば、オブジェクト指向プログ
ラミングだと、結構ありがち。
• PHP4 では ushort (16bits)だよね。。。
もうひとつ増やしてみよう
• +1
• えっ?
\(^o^)/
• さらに +1
なんてこったい /(^o^)\
PHP5 では大丈夫?
• unsigned int (大抵 32 bit) でも結局溢れるん
じゃ?
↓試してみました
65536*65536 の結果
• メモリが溢れました
ですよね~www
実質的に問題ない。(はず)
PHP の最近(?)
• PHP-5.3 以降 cycle collector の実装が入りま
した
http://php.net/manual/ja/features.gc.collecti
ng-cycles.php
zend_gc.c
• Static で grep してみる
• それっぽいのが入ってました。(root とか mark と
か grey とかそれっぽい。中身は機会があれば)
これって本当にいるの?
• php のプロセスの寿命はどうせ、1 request サ
イクル
• よほど変なコーディングをしないと、循環参照
で問題にならないよね
• バッチでは… 結構問題になるけど。
課題
• パフォーマンステスト
• apache 上で動かす時と、コマンドラインとで切
り替えられないのかな
• でも、PHP 5.3 なんて使うの当分先なので、い
いやw
以上です
• ご静聴、ありがとうございました.