manual-php
Version:
59 lines (38 loc) • 1.55 kB
Markdown
# 垃圾回收机制
> 垃圾回收机制是一种动态存储分配方案,它会自动释放程序不再需要的已分配的内存块。垃圾回收机制可以让程序员不必过分关心程序内存分配,从而将更多的精力投入到业务逻辑。在现在流行的各种语言当中,垃圾回收机制是新一代语言所共有的特征。
* [引用计数](#引用计数)
* [写时复制](#写时复制)
## 引用计数
在 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)
```