【发布时间】:2011-03-22 04:31:23
【问题描述】:
调用unset() 会释放与该对象关联的内存吗?在某些情况下,我发现自己在处理大型关联数组,我想在完成后删除它们(释放内存以创建新数组)。
【问题讨论】:
调用unset() 会释放与该对象关联的内存吗?在某些情况下,我发现自己在处理大型关联数组,我想在完成后删除它们(释放内存以创建新数组)。
【问题讨论】:
调用 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() 都应该在该变量的适当范围内完成。
【讨论】:
它不会立即释放内存,但它允许垃圾收集器这样做。
【讨论】:
通过取消设置变量,您将其“引用计数”设置为 0。这允许 Zend 引擎在内存中移动内容,并且它知道它可以覆盖内存中的变量区域,因为它的引用计数为 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() 函数强制收集任何现有的垃圾循环。
【讨论】: