【发布时间】:2014-08-24 19:53:14
【问题描述】:
前言:我确实知道“未设置”在用户空间中是如何工作的,但我想了解它在内部是如何工作的。
当在zval structure 上调用 unset 时,它会减少引用计数器 (refcount__gc)。当 refcount__gc 达到 0 时,该变量不再使用,可以删除。问题是它是总是立即完成,还是在某些情况下可以由垃圾收集器稍后完成?
我发现了两个相互矛盾的陈述:
unset() 就像它的名字所说的那样 - 取消设置一个变量。它不会强制立即释放内存。 PHP 的垃圾收集器将在它认为合适的时候执行它 - 有意尽快,因为无论如何都不需要这些 CPU 周期,或者直到脚本耗尽内存之前,无论首先发生什么。 - Stackoverflow answer mentioning 2009 php.net documentation
反之:
当 refcount 达到零时,zval 被销毁,它所持有的任何内存现在都是空闲的 - Better Understanding PHP’s Garbage Collection, 2012 article
那么,假设 PHP 5.3 和 PHP 5.5,哪一个是正确的?如果可能的话,也许您可以提供指向 PHP 源代码中未设置定义的链接。谢谢!
【问题讨论】:
标签: php garbage-collection unset