取消设置后PHP释放内存
用于测试的小代码:取消设置后PHP释放内存,php,memory-management,memory-leaks,Php,Memory Management,Memory Leaks,用于测试的小代码: $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;
$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
$strings=array(“PHP有一个为您管理内存的工具,它以几种不同的方式影响(进程的)内存使用
首先,在检查进程外部进程的内存使用情况时,即使PHP看到一些内存需要释放,也可能不会将其释放回操作系统以用于与内存分配相关的优化目的。这可以减少连续释放和分配的开销,GC语言更容易实现这一点,因为分配过程不是v看不到实际的程序
因此,即使手动调用gc\u collect\u cycles()
,内存可能根本不会释放到操作系统,而是重新用于将来的分配。这导致PHP看到的内存使用量比实际使用的进程要小,因为一些早期的大保留永远不会释放回操作系统
其次,由于垃圾收集的性质,程序标记为未使用后,内存可能不会立即释放。调用gc\u collect\u cycles()
将立即释放内存,但应该看到它是不必要的,如果脚本中存在逻辑(或PHP中的某些内容)内存泄漏,则它不起作用
为了了解发生了什么,逐行检查(例如使用Xdebug的函数跟踪)将使您更好地了解PHP(或者更确切地说,您的程序)如何查看内存使用情况
将其与流程外部的逐行检查相结合(例如pmap
命令)会告诉PHP在保留内存后是否在任何时候释放内存。我认为PHP会自行决定何时收集垃圾。可能有一种方法可以强制它触发垃圾收集,但这仍然不能保证您取消设置的内容将包含在收集中。Dogc\u collect\u cycles()
强制垃圾收集(PHP 5.3+)@apokryfos如何强制垃圾收集?我发现了这个函数->gc\u collect\u cycles
,但出于另一个目的,我认为我个人主张不要处理垃圾收集。关键是,在任何有垃圾收集器的语言中,语言本身决定何时需要运行垃圾收集器ng是昂贵的。另外,对pmap
usage stats持保留态度。gc\u collect\u cycles()
将强制运行垃圾收集器(从而收集未使用的资源),但出于@apokryfos提到的原因,不鼓励手动运行它。它在PHP-5.3之前就已经使用过了,因为GC没有正确地完成它的工作,但是现在所有未使用的东西都应该被清理掉,至少在内存耗尽时是如此。同样,为了了解PHP如何看待内存使用情况,请使用Xdebug的函数跟踪和内存增量to查看是否有泄漏:)即使PHP释放了一个资源,它也可能不会将内存释放给其他进程,因此外部内存检查可能不会给出实际内存使用情况的结果,只能给出PHP为自己保留的结果。