【发布时间】:2016-06-16 12:36:41
【问题描述】:
用于测试的小代码:
$strings = array('<big string here (2 Mb)');
$arr = array();
//--> memory usage here is 17.1Mb (checked by pmap)
echo memory_get_usage();//0.5Mb
//(i know, that other 16.6Mb of memory used by process are php libraries)
for($i = 0; $i < 20; ++$i)
{
$strings_local = array_merge($strings, array($i));
$arr[$i] = $strings_local;
unset($strings_local);
}
//--> memory usage here is 20.3Mb (checked by pmap)
echo memory_get_usage();//3.7Mb
//so, here its all ok, 17.1+3.2 = 20.3Mb
for($i = 0; $i < 20; ++$i)
{
unset($arr[$i]);
}
//--> memory usage here is 20.3Mb (checked by pmap)
//BUT?? i UNSET this variables...
echo memory_get_usage();//0.5Mb
所以,似乎 php 不是可用内存,即使您 unset() 您的变量也是如此。取消设置后如何释放内存?
【问题讨论】:
-
我认为 PHP 自己决定何时收集垃圾。可能有一种方法可以强制它触发垃圾收集,但这仍然不能保证您未设置的内容将包含在收集中。执行
gc_collect_cycles()强制垃圾回收(PHP 5.3 + ) -
@apokryfos 我如何强制垃圾收集?我找到了这个函数 ->
gc_collect_cycles,但我认为它有其他目的 -
我个人主张不要理会垃圾收集而不是处理它。关键是,在任何具有垃圾收集器的语言中,语言本身决定何时需要运行它。垃圾收集成本很高。另外,对
pmap的使用情况统计数据持保留态度。 -
gc_collect_cycles()将强制运行垃圾收集器(并因此收集未使用的资源),但由于@apokryfos 提到的原因,不鼓励手动运行它。它确实在 PHP-5.3 之前使用过,因为 GC 没有正确完成它的工作,但是现在至少在内存不足时应该清理所有未使用的东西。 -
再次,为了了解 PHP 如何查看内存使用情况,请使用带有内存增量的 Xdebug 函数跟踪来查看某处是否存在泄漏 :) 即使 PHP 释放资源,它也可能不会将内存释放给其他进程,因此外部检查内存可能不会给出实际内存使用的结果,只有 PHP 保留给自己的结果。
标签: php memory-management memory-leaks