垃圾回收机制
垃圾回收机制是一种动态存储分配方案,它会自动释放程序不再需要的已分配的内存块。垃圾回收机制可以让程序员不必过分关心程序内存分配,从而将更多的精力投入到业务逻辑。在现在流行的各种语言当中,垃圾回收机制是新一代语言所共有的特征。
引用计数
在 PHP 中,变量的回收和该变量的引用次数有关。
<?php
class Foo
{
//
}
$foo = new Foo();
xdebug_debug_zval('foo'); // foo: (refcount=1, is_ref=0)=class Foo { }
当 unset()
该变量后,该变量的引用次数将会减 1 ,如果该变量的引用次数为 0 ,则 PHP 会释放该变量所占用的内存空间。
<?php
class Foo
{
//
}
$foo = new Foo();
xdebug_debug_zval('foo'); // foo: (refcount=1, is_ref=0)=class Foo { }
unset($foo);
xdebug_debug_zval('foo'); // foo: no such symbol
写时复制
在 PHP 中,当变量 A 赋值给另一个变量 B 的时候,并没有立刻生成一个新的变量容器,而是将变量 B 指向了变量 A 指向的变量容器,即内存共享。而当变量 B 其中元素发生改变时,才会真正发生变量容器复制。
<?php
$foo = [2];
$bar = $foo;
$baz = $bar;
xdebug_debug_zval('foo'); // foo: (refcount=4, is_ref=0)=array (0 => (refcount=0, is_ref=0)=2)
$baz = [];
xdebug_debug_zval('foo'); // foo: (refcount=3, is_ref=0)=array (0 => (refcount=0, is_ref=0)=2)