$a = 'apple'; $b = &$a;
上述代码中,我将一个字符串赋值给变量a,然后将a的引用赋值给了变量b。显然,这个时候的内存指向应该是这样的:
$a -> 'apple' <- $b
a和b指向了同一块内存区域(变量容器),我们通过 var_dump($a, $b)
得到 string(5) "apple" string(5) "apple"
,这是我们预期的结果。
假如我想将 'apple'
这个字符串从内存中释放掉。我是这么做的:
unset($a);
但是通过再次打印 $a
$b
两变量的信息,我得到了这样的结果:Notice: Undefined variable: a
和 string(5) "apple"
。奇怪,$a
$b
同时指向一块内存区域,又明明将$a
释放了,为什么$b还是'apple'
。
其实是这样的,unset()
这是将一个变量指针销毁了,并没有释放掉那块内存区域(变量容器),所以执行完操作之后,内存指向只是变成了这样:
'apple' <- $b
要牢记重点: unset()并没有释放变量所指向的那块内存(变量容器),而只是将变量指针销毁了。同时,将那块内存的 引用计数 (ref count) 减1,当引用计数为0时,也就是说当那块内存(变量容器)不被任何变量引用时,便会触发php的垃圾回收。
用代码来验证一下:
$a = 'apple'; $b = &$a; $before = memory_get_usage(); unset($a); $after = memory_get_usage(); var_dump($before - $after); // 结果为int(0),没有释放
$a = 'apple'; $b = &$a; $before = memory_get_usage(); unset($a, $b); $after = memory_get_usage(); var_dump($before - $after); // 结果为int(24),得到释放
那要怎样做才能真正释放掉 'apple'
所占用的内存呢?
利用上述方法,我们可以在 unset($a)
之后再 unset($b)
,将内存区域的所有引用都销毁,引用计数减为0了,自然就被php回收了。
当然,还有更直接的方法:
$a = null;
直接赋值 null
会将将 $a
所指向的内存区域置空,并将引用计数归零,内存便被释放。
php是脚本语言,当脚本执行结束之后,脚本内使用的所有内存都会被释放。那么,我们手动去释放内存有意义吗?其实关于这个问题,早有解答,推荐大家看一下鸟哥 @laruence 2012年发表的一篇文章:请手动释放你的资源(Please release resources manually)
$a = 'apple'; $b = &$a;
上述代码中,我将一个字符串赋值给变量a,然后将a的引用赋值给了变量b。显然,这个时候的内存指向应该是这样的:
$a -> 'apple' <- $b
a和b指向了同一块内存区域(变量容器),我们通过 var_dump($a, $b)
得到 string(5) "apple" string(5) "apple"
,这是我们预期的结果。
假如我想将 'apple'
这个字符串从内存中释放掉。我是这么做的:
unset($a);
但是通过再次打印 $a
$b
两变量的信息,我得到了这样的结果:Notice: Undefined variable: a
和 string(5) "apple"
。奇怪,$a
$b
同时指向一块内存区域,又明明将$a
释放了,为什么$b还是'apple'
。
其实是这样的,unset()
这是将一个变量指针销毁了,并没有释放掉那块内存区域(变量容器),所以执行完操作之后,内存指向只是变成了这样:
'apple' <- $b
要牢记重点: unset()并没有释放变量所指向的那块内存(变量容器),而只是将变量指针销毁了。同时,将那块内存的 引用计数 (ref count) 减1,当引用计数为0时,也就是说当那块内存(变量容器)不被任何变量引用时,便会触发php的垃圾回收。
用代码来验证一下:
$a = 'apple'; $b = &$a; $before = memory_get_usage(); unset($a); $after = memory_get_usage(); var_dump($before - $after); // 结果为int(0),没有释放
$a = 'apple'; $b = &$a; $before = memory_get_usage(); unset($a, $b); $after = memory_get_usage(); var_dump($before - $after); // 结果为int(24),得到释放
那要怎样做才能真正释放掉 'apple'
所占用的内存呢?
利用上述方法,我们可以在 unset($a)
之后再 unset($b)
,将内存区域的所有引用都销毁,引用计数减为0了,自然就被php回收了。
当然,还有更直接的方法:
$a = null;
直接赋值 null
会将将 $a
所指向的内存区域置空,并将引用计数归零,内存便被释放。
Atas ialah kandungan terperinci PHP之脚本的内存管理和垃圾回收. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!