【发布时间】: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 参数显示使用的内存块