PHPで親子関係のオブジェクトが相互に参照を持つ ($parent->children がありかつ $child->parent がある) ケースの話をしていたとき、循環参照の話題が出たのでふと気になって調査してみました。 結論からいうと、PHPは5.2まで、単純な参照カウンタ方式のGCのみを採用していました。5.3からは、参照カウンタ方式に加えて、循環参照を回収するGCも併用するようになりました。 PHP: 循環の収集 - Manual PHPの変数は、基本的には参照カウンタが0になった時点でメモリを解放します。が、それだけでは、循環参照があると0までカウンタが落ち切らない変数が発生します。かといって、毎回循環参照をチェックするとパフォーマンス低下が発生します。そこで、GC監視下の変数が一定数 (コンパイル時のGC_ROOT_BUFFER_MAX_ENTRIES定数、通常は1万) を超え
![PHPのGCは循環参照を回収できる - なんたらノート第三期ベータ](https://cdn-ak-scissors.b.st-hatena.com/image/square/ce047d3453ff59c8f07812ab88fb5ad8279eadad/height=288;version=1;width=512/https%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Ft%2Ftanakahisateru%2F20160628%2F20160628150429.png)