(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 以上です • ご静聴、ありがとうございました.
© Copyright 2024 ExpyDoc