UNPKG

manual-php

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