今回は、GCについて調べてみました。
<?php gc_enable(); // GC 有効 $before_memory = memory_get_usage(); $a = array(); $after_memory = memory_get_usage(); $used_memory = $after_memory-$before_memory; echo "使用メモリ before[{$before_memory}] after[{$after_memory}]:after - before = {$used_memory}\n"; gc_collect_cycles(); $after_gc_memory = memory_get_usage(); $used_gc_memory = $after_gc_memory-$before_memory; echo "GC後メモリ before[{$before_memory}] after[{$after_gc_memory}]:after - before = {$used_gc_memory}\n"; $before_memory = memory_get_usage(); for( $i = 0;$i < 100;$i++ ){ $a[] = ""; } $after_memory = memory_get_usage(); $used_memory = $after_memory-$before_memory; echo "使用メモリ before[{$before_memory}] after[{$after_memory}]:after - before = {$used_memory}\n"; gc_collect_cycles(); $after_gc_memory = memory_get_usage(); $used_gc_memory = $after_gc_memory-$before_memory; echo "GC後メモリ before[{$before_memory}] after[{$after_gc_memory}]:after - before = {$used_gc_memory}\n";
実行結果がこちらです。
$ php -v PHP 5.3.29 (cli) (built: May 12 2015 22:42:19) Copyright (c) 1997-2014 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2014 Zend Technologies $ php test_gc.php 使用メモリ before[631008] after[631472]:after - before = 464 GC後メモリ before[631008] after[631808]:after - before = 800 使用メモリ before[632112] after[650024]:after - before = 17912 GC後メモリ before[632112] after[650024]:after - before = 17912
$ php -v PHP 7.1.23 (cli) (built: Feb 22 2019 22:19:32) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies $ php test_gc.php vi test_gc.php 使用メモリ before[357616] after[357616]:after - before = 0 GC後メモリ before[357616] after[357648]:after - before = 32 使用メモリ before[357648] after[365896]:after - before = 8248 GC後メモリ before[357648] after[365896]:after - before = 8248
場合によってGCを実行することでメモリ使用が増える場合があるようです。
不思議だ。