所以,我正在运行一个长时间运行的脚本来处理内存敏感数据(大量的)。我(想)我在长时间运行的过程中正确地破坏了大型物体,以节省内存。
我有一个连续输出当前内存使用情况的日志(使用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)
答案 0 :(得分:2)
PHP有垃圾收集器。它将为引用计数设置为0
的变量容器释放内存,这意味着不再存在用户空间引用。
我想还有一些你可能认为已经清理过的变量的引用。需要查看代码以显示问题所在。