【问题标题】:Memory Issues with PHP (5)PHP 的内存问题 (5)
【发布时间】:2011-03-22 04:31:23
【问题描述】:

调用unset() 会释放与该对象关联的内存吗?在某些情况下,我发现自己在处理大型关联数组,我想在完成后删除它们(释放内存以创建新数组)。

【问题讨论】:

    标签: php memory unset


    【解决方案1】:

    调用 unset() 是否释放内存 与该对象相关联?

    是的。

    使用memory_get_usage()自行检查:

    echo memory_get_usage() . "<br />";
    unset($array['key']);
    unset($array['key2']);
    unset($array['key3']);
    echo memory_get_usage();
    

    更多资源:

    引用后面的链接:

    PHP 执行垃圾收集 三个主要关口:

    1. 当你告诉它时
    2. 离开函数时
    3. 脚本结束时

    情况 1 在您使用时发生 unset()、mysql_free_result() 或其他 资源破坏函数 在你之后明确清除 变量。情况 2 清除 隐式资源 - 任何变量 留下范围,即不再是 适用,为您清理。 最后,情况 3 释放了所有 隐含的与脚本相关的资源。

    【讨论】:

      【解决方案2】:

      unset() 在 php 中“释放”内存,但它让垃圾收集器决定何时实际释放所述内存。因此,内存会根据需要或方便(在 PHP 耗尽可用内存之前)释放。

      一个主要的警告是注意你没有尝试在本地范围内unset() 全局变量。即使在函数的语言环境中执行此操作时,通过引用传入的变量也只会具有其本地引用unset。要真正使内存可用,任何unset() 都应该在该变量的适当范围内完成。

      【讨论】:

      • 是的。我们不会谈论我是如何与这个微小的细节变得亲密的。 :P
      【解决方案3】:

      它不会立即释放内存,但它允许垃圾收集器这样做。

      【讨论】:

        【解决方案4】:

        通过取消设置变量,您将其“引用计数”设置为 0。这允许 Zend 引擎在内存中移动内容,并且它知道它可以覆盖内存中的变量区域,因为它的引用计数为 0。

        这发生在垃圾回收之前。所以你有它, unset() 实际上在你的应用程序的生命周期中帮助你。

        【讨论】:

        • 错了。通过取消设置,您减少了变量的引用计数——更准确地说,是 zval 的引用计数。
        • 当提到一个“变量”时,它暗示了一个 zval,因为那是它的数据结构。我说的没有错。 ZE MM 做了我上面描述的事情。
        【解决方案5】:

        不,它不一定释放任何东西。它只是减少了引用计数。

        例子:

        //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 的调用中发生了变化。

        【讨论】:

        • 所以你的意思是对象本身只有在所有引用都未设置时才会被释放,对吧?
        【解决方案6】:

        在 PHP >5.3.0 中,gc_collect_cycles() 函数强制收集任何现有的垃圾循环。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-22
          • 2020-09-23
          • 2023-03-28
          • 2011-05-31
          • 1970-01-01
          • 2012-10-30
          相关资源
          最近更新 更多