调用是否unset()
释放与该对象关联的内存?在某些情况下,我发现自己正在处理大型关联数组,并且我想在完成后删除它们(释放内存以创建新数组)。
6 回答
调用 unset() 是否释放与该对象关联的内存?
是的,它确实。
检查自己使用memory_get_usage()
:
echo memory_get_usage() . "<br />";
unset($array['key']);
unset($array['key2']);
unset($array['key3']);
echo memory_get_usage();
更多资源:
引用后面的链接:
PHP 在三个主要节点执行垃圾收集:
- 当你告诉它
- 当你离开一个函数
- 脚本结束时
情况 1 发生在您使用 unset()、 mysql_free_result() 或其他在变量之后显式清除的资源破坏函数时。情况 2 隐式清除资源 - 任何离开范围(即不再适用)的变量都会为您清除。最后,情况 3 隐式释放了所有与脚本相关的资源。
unset()
在 php 中“释放”内存,但它让垃圾收集器决定何时实际释放所述内存。因此,内存是在需要或方便的基础上释放的(在 PHP 耗尽可用内存之前)。
一个主要的警告是要注意您没有尝试unset()
在本地范围内使用全局变量。unset
即使是通过引用传入的变量也只有在函数的语言环境中执行时才会有它们的本地引用。要真正使内存可用,unset()
应该在该变量的适当范围内完成任何操作。
它不会立即释放内存,但它允许垃圾收集器这样做。
通过取消设置变量,您将其“refcount”设置为 0。这允许 Zend 引擎在内存中移动事物,并且它知道它可以覆盖内存中的变量区域,因为它的 refcount 为 0。
这发生在甚至考虑到垃圾收集之前。所以你有它, unset() 实际上在你的应用程序的生命周期中帮助你。
不,它不一定释放任何东西。它只是减少了引用计数。
例子:
//object has reference count 1 because it has one variable referencing 1
$a = new BigObject;
//object still has reference count 2, but no new object was allocated in memory
$b = $a;
//object has reference count 1
unset($a);
//the object is still in memory
Nitpick 角落:从技术上讲,这里有两个引用计数——对象的和 zval 的。在整个程序中,对象的引用计数只有 1,实际上是 zval 的引用计数在赋值和调用中发生了变化unset
。
在 PHP >5.3.0 中,gc_collect_cycles()函数强制收集任何现有的垃圾循环。