未设置后PHP可用内存

问题描述 投票:1回答:1

它的小代码用于测试:

$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 memory-management memory-leaks
1个回答
2
投票

PHP有garbage collector,它为您处理内存管理,它以几种不同的方式影响(进程的)内存使用。

首先,在检查进程外部进程的内存使用情况时,即使PHP看到某些内存被释放,也可能无法将其释放回操作系统以进行与内存分配相关的优化。这减少了连续释放和分配的开销,使用GC语言更容易实现,因为实际程序看不到分配过程。

因此,即使手动调用gc_collect_cycles(),内存也可能根本不会释放到操作系统,而是重用于将来的分配。这导致PHP看到比实际使用的进程更少的内存使用量,因为一些早期的大预留永远不会释放回操作系统。

其次,由于垃圾收集的性质,在程序标记为未使用之后,内存可能不会立即释放。调用gc_collect_cycles()会立即释放内存,但是应该看到它是不必要的,并且如果你的脚本中存在逻辑(或PHP泄漏中的某些内容)内存泄漏,则无法工作。

为了了解发生了什么,逐行检查(例如使用Xdebug的函数跟踪)可以让您更好地了解PHP(或者更确切地说,您的程序)如何看待内存使用情况。

将其与流程外部的逐行检查相结合(例如,您的pmap命令)将告诉PHP在保留后是否实际释放任何内存。

© www.soinside.com 2019 - 2024. All rights reserved.