取消设置后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会自行决定何时收集垃圾。可能有一种方法可以强制它触发垃圾收集,但这仍然不能保证您取消设置的内容将包含在收集中。Do
gc\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为自己保留的结果。