# 垃圾回收机制

> 垃圾回收机制是一种动态存储分配方案，它会自动释放程序不再需要的已分配的内存块。垃圾回收机制可以让程序员不必过分关心程序内存分配，从而将更多的精力投入到业务逻辑。在现在流行的各种语言当中，垃圾回收机制是新一代语言所共有的特征。

* [引用计数](#引用计数)
* [写时复制](#写时复制)

## 引用计数

在 PHP 中，变量的回收和该变量的引用次数有关。

```php
<?php

class Foo
{
    //
}

$foo = new Foo();
xdebug_debug_zval('foo'); // foo: (refcount=1, is_ref=0)=class Foo {  }

```

当 `unset()` 该变量后，该变量的引用次数将会减 1 ，如果该变量的引用次数为 0 ，则 PHP 会释放该变量所占用的内存空间。

```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
<?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)

```

