PHP の array は明示的に消さないと GC 怪しそう
ふと、メモリリークどうなってるんだろうと確認してみた。当方 PHP5.4.4
- 続き > PHP の array は明示的に消さないと GC 怪しそう (2) - yoyaのメモ (GC じゃなくてメモリアロケータの問題っぽい)
- unset は問題なし
$ php -r 'for ($i=0;$i<100;$i++) { $a=range(1,1000000); unset ($a); echo memory_get_usage(true).PHP_EOL;}' 1048576 1048576 1048576 1048576
- (null 等で) 上書きも問題なし
yoya@sakura:~$ php -r 'for ($i=0;$i<100;$i++) { $a=range(1,1000000); $a=null; echo memory_get_usage(true).PHP_EOL;}' 1310720 1310720 1310720 1310720
- 変数上書きで GC の回収に任せると
yoya@sakura:~$ php -r 'for ($i=0;$i<100;$i++) { $a=range(1,1000000); echo memory_get_usage(true).PHP_EOL;}' 209453056 210239488 209977344 210501632
サイズが大きいのは当然として、上下してるのが怪しい。。
配列数を変えて試す
- 1...1024 (初めから安定)
$ php -r 'for ($i=1;$i<4;$i++) { $a=range(1,1024); ech o $i.",".memory_get_usage(true).PHP_EOL;}' 1,524288 2,524288 3,524288 4,524288
- 1...1025 (2回目から安定)
$ php -r 'for ($i=1;$i<4;$i++) { $a=range(1,1025); ech o $i.",".memory_get_usage(true).PHP_EOL;}' 1,524288 2,786432 3,786432 4,786432
- 1..100000 (102回目から安定)
$ php -r 'for ($i=1;$i<200;$i++) { $a=range(1,100000); echo $i.",".memory_get_usage(true).PHP_EOL;}' | head -103 | tail -5 99,28311552 100,28573696 101,28573696 102,28835840 103,28835840
最後に
誰か追試とソース解析よろしく!