【问题标题】:PHP - memory_get_usage, decreases when setting variblesPHP - memory_get_usage,设置变量时减少
【发布时间】:2015-11-19 16:13:20
【问题描述】:

我有一个奇怪的问题,我在 PHP 中运行 memory_get_usage 函数。我在 str_repeats 之后运行这些。我总是希望内存使用的值每次都更多。但也有常见的情况,每次都少。这怎么可能?

<?php

while(true) {

$num1 = rand(1,1000000);
$string1 = str_repeat('    ',$num1);

$memoryUsed1 = memory_get_peak_usage(false);
$memoryAllcoated1 = memory_get_peak_usage(true);
$memoryUsed2 = memory_get_usage(false);
$memoryAllcoated2 = memory_get_usage(true);

$num2 = rand(1,1000000);
$string2 = str_repeat('    ',$num2);

$memoryUsed3 = memory_get_peak_usage(false);
$memoryAllcoated3 = memory_get_peak_usage(true);
$memoryUsed4 = memory_get_usage(false);
$memoryAllcoated4 = memory_get_usage(true);

$num3 = rand(1,1000000);
$string3 = str_repeat('    ',$num3);

$memoryUsed5 = memory_get_peak_usage(false);
$memoryAllcoated5 = memory_get_peak_usage(true);
$memoryUsed6 = memory_get_usage(false);
$memoryAllcoated6 = memory_get_usage(true);

}

?>


$memoryUsed2 = 9200808
$memoryAllocated2 = 9961472

$memoryUsed4 = 7960528
$memoryAllocated4 = 8912896

$memoryUsed6 = 6230648
$memoryAllocated6 = 7077888

$num1 = 921888
$num2 = 465006
$num3 = 92134

因此字符串的重复次数减少了。它是从函数的最后一点开始测量内存吗?谁能解开这个谜?

ps。我正在使用调试器来获取这些值,这可能不可靠吗?

【问题讨论】:

  • 无法重现该行为,但由于您的变量不再被引用,它们可能被垃圾回收了吗?
  • 怎么出问题了?在获取内存使用之前尝试强制 gc:gc_collect_cycles().
  • @AlexBlex 这是一个问题,如果我要统计地记录记忆,这在我看来没有多大意义。
  • @MatthewUnderwood,最好使用为此目的设计的外部工具。从 psnagios 的任何内容,但 php。这种脚本语言中的内存管理非常基础,不可靠,在任何人看来都没有多大意义。

标签: php memory memory-management


【解决方案1】:

如果单独运行,while 中的代码不会产生三个连续递减的memory_get_usage 读数。 但是,在每次迭代都会用三个随机大小的值覆盖三个变量的循环中,您可能会遇到与前一次相比变小的情况,从而减少内存使用量。

考虑一下:

$multipliers = [
   [10000000, 10000000, 10000000],
   [1000, 1000, 1000],
];

foreach($multipliers as $numbers) {
   foreach($numbers as $k=>$v) {
      $s[$k] = str_repeat(" ", $v);
      $m[$k] = memory_get_usage(true);
   }
   print_r($m);
}

并注意第二遍的结果:

Array
(
    [0] => 10485760
    [1] => 20709376
    [2] => 30932992
)
Array
(
    [0] => 20709376
    [1] => 10485760
    [2] => 262144
)

【讨论】:

    猜你喜欢
    • 2016-12-23
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    相关资源
    最近更新 更多