【问题标题】:PHP Memory Allocation and DeallocationPHP 内存分配和释放
【发布时间】:2020-08-25 00:04:10
【问题描述】:

所以,我正在运行一个处理内存敏感数据(大量数据)的长时间运行脚本。我(认为)我在整个长时间运行的过程中正确销毁大型对象以节省内存方面做得很好。

我有一个持续输出当前内存使用量的日志(使用 memory_get_usage()),我没有注意到内存使用量的上升和下降(显着的)。这告诉我,我可能在内存管理方面做对了。

但是,如果我登录到服务器并运行 top 命令,我注意到处理此脚本的 apache 进程永远不会释放内存(至少通过 top 命令可见)。它只是保持在最高的内存使用率,即使 php 报告的当前内存使用量要低得多。

所以,我的问题是:如果内存没有真正释放回服务器,我节省内存的尝试是徒劳的吗?还是我在这里遗漏了什么。

谢谢。

ps。在 linux 上使用 php 5.4

pps。对于那些想要代码的人来说,这是一个基本的表示:

function bigData()
{
    $obj = new BigDataObj();
    $obj->loadALotOfData();

    $varA = $obj->getALotOfData();

    //all done
    $obj = NULL;
    $varA = NULL;
    unset($obj,$varA);
}

更新:按照 hek2mgl 的建议,我运行了 debug_zval_dump(),输出对我来说似乎是正确的。

function bigData()
{
    $obj = new BigDataObj();
    $obj->loadALotOfData();

    //all done
    $obj = NULL;

    debug_zval_dump($obj);

    unset($obj);

    debug_zval_dump($obj);
}

输出:

NULL refcount(2)

NULL refcount(1)

【问题讨论】:

  • 您调用 memory_get_usage() 时是否带有 TRUE 参数?它有很大的不同:使用 TRUE 参数返回使用 emalloc 请求的实际内存;而 FALSE 参数显示使用的内存块
  • 与其使用 PHP 自己的 memory_get_usage() 函数来检查内存使用情况,不如尝试使用xhprofGUI 让它特别好用

标签: php memory php-5.4


【解决方案1】:

PHP 有一个垃圾收集器。它将为引用计数设置为0 的变量容器释放内存,这意味着不再存在用户空间引用。

我猜仍然存在对您可能认为已清理的变量的引用。需要查看您的代码以显示问题所在。

【讨论】:

  • PHP 似乎可以很好地收集垃圾,正如我从 get_memory_usage() 输出中看到的那样。我知道这些对象不再被引用,因为它们中的很多都是在函数内部以任何方式创建和销毁的。
  • 你说垃圾收集器有问题?使用debug_zval_dump($object) 确保没有引用。
  • 我没有说它有问题 :p 我不知道是否有任何问题,我只是观察预期的行为。我会试试那个电话。
  • @hek2mgl 你不需要引用来将它传递给函数吗:)
  • @Orangepill :) 是的,当然。我的意思是直接在unset() 之前,该测试中的引用计数应该是1。 (懒得解释了,谢谢提问)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 2011-12-09
  • 1970-01-01
  • 2021-04-21
  • 2011-05-13
  • 2018-01-23
相关资源
最近更新 更多