【问题标题】:PHP free memory after unset取消设置后的PHP可用内存
【发布时间】: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


【解决方案1】:

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

首先,在检查进程外进程的内存使用情况时,即使 PHP 发现有一些内存被释放,它也可能不会被释放回操作系统以用于与内存分配相关的优化目的。这是减少连续释放和分配的开销,这在 GC 语言中更容易发生,因为分配过程对实际程序不可见。

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

其次,由于垃圾收集的性质,内存在被程序标记为未使用后可能不会立即释放。调用gc_collect_cycles() 将立即释放内存,但应该认为这是不必要的,并且如果您的脚本中存在逻辑(或 PHP 泄漏)内存泄漏,则它不起作用。

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

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

【讨论】:

    猜你喜欢
    • 2011-08-24
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2012-09-11
    • 2014-07-18
    • 2014-03-25
    相关资源
    最近更新 更多