PHP の array は明示的に消さないと GC 怪しそう

ふと、メモリリークどうなってるんだろうと確認してみた。当方 PHP5.4.4

  • 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

サイズが大きいのは当然として、上下してるのが怪しい。。

グラフで

  • PHP5.4.4

ファッ!?

  • ついでに、PHP5.3.3


配列数を変えて試す

  • 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

最後に

誰か追試とソース解析よろしく!