当前位置: 首页 > 面试题库 >

使用PHP释放内存的更好方法是:unset()或$ var = null

董和泽
2023-03-14
问题内容

我意识到第二个方法避免了函数调用的开销( update
,实际上是一种语言构造),但是知道一个方法是否比另一个更好会很有趣。我一直在使用unset()大多数代码,但是最近我浏览了一些可以从网上找到的可$var = null代替的类。

有没有首选的,这是什么原因?


问题答案:

在2009年未设置的手册页中提到过:

unset()确实按照其名称所说-取消设置变量。它不会强制立即释放内存。PHP的垃圾收集器将在其认为合适的情况下进行此操作-
出于故意,因为无论如何都不需要这些CPU周期,或者直到脚本耗尽内存之前(无论哪种情况先发生)。

如果这样做,$whatever = null;则将重写变量的数据。您可能会更快地释放/缩小内存,但可能会从真正需要它们的代码中窃取CPU周期,从而导致更长的总体执行时间。

(自2013年以来,该unset手册页不再包含该部分)

请注意,直到php5.3为止,如果您有两个循环引用的对象(例如,父子关系),则在父对象上调用unset()不会释放子对象中用于父引用的内存。(当父对象被垃圾回收时,也不会释放内存。)bug33595

问题“ unset和= null之间的差异”详细说明了一些差异:

unset($a)$a从符号表中删除;例如:

$a = str_repeat('hello world ', 100);
unset($a);
var_dump($a);

输出:

Notice: Undefined variable: a in xxx
NULL

但是何时$a = null使用:

$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
Outputs:

NULL

似乎这$a = null比它的unset()对应对象要快一些:更新符号表条目似乎比删除它快。

  • 当您尝试使用不存在的(unset)变量时,将触发错误,并且变量表达式的值将为null。(因为,PHP还应该做什么?每个表达式都需要产生一些值。)
  • 分配了null的变量仍然是完全正常的变量。


 类似资料:
  • 问题内容: 我正在使用以下功能下载小于20MB的文件。它将全部内容读取到内存中,因为另一个功能必须先对字节执行工作,然后才能将其写入磁盘。 这可以正常工作,但是所有内存都在系统上消耗了。 是否可以在其他功能处理完之后释放使用的内存,以使内存使用量不会大于当前正在处理的字节数? 问题答案: 您可能会触发gc使用释放未使用的对象,并且可能敦促Go运行时使用释放内存到OS ,但是所有这些都只是在扑救。编

  • 释放stringbuilder内存的最快方法是什么。 下面是我试图尽快释放内存并使对象符合垃圾收集条件的代码片段 备选案文1: 根据我的理解,stringBuilder中的所有数据都将被删除,对象一旦被踢入,就有资格获得垃圾回收机制,但stringBuilder占用的文本内存将被释放。它的字符串值也会从堆中删除,还是会存储在字符串池中? 选项2: 这将重置字符串生成器的长度,但不会被垃圾收集 选项

  • 使用SXSSFWorkbook读取Excel,1W行数据,188列(测试时只有前16列有数据) 读取操作完成后,JVM中存在大量的org.apache.xmlbeans.impl.store.Xobj$AttrXobj org.apache.xmlbeans.impl.store.Xobj$ElementXob类的实例,很长时间内不会被GC 我尝试过使用SAX事件驱动解析Excel、Streami

  • 注意:这里寻求的非特定解决方案是,如果屏幕大小没有改变,如何避免触发代码,例如,在Y轴上翻转iPad(从landscapeLeft到landscapeRight),向某人显示视图而不调整其大小。换句话说,视图将旋转而不调整大小)。该测试基本上验证了没有发生向不同方向的中间旋转。 我正在开发一个地图应用程序,希望在方向之间切换时保持缩放级别不变。然而,当纵向上下不受支持时,就会出现某种错误,这是我想

  • 问题内容: 考虑这两个例子… 我很想知道这些方法是否更好。我一直使用第一个示例,但是看到很多人在此站点上使用第二个示例。 那么,哪个更好?快点?意图更清晰? 问题答案: 速度更快,但与并不相同。 即使值是,也仅检查密钥是否存在。 而 将返回如果该键存在和价值。