为什么PHP脚本会不断占用更多内存?

时间:2011-03-23 15:24:21

标签: php

见这个例子:

echo memory_get_usage() . "\n"; // 36640
$a = str_repeat("Hello", 4242);
echo memory_get_usage() . "\n"; // 57960
unset($a);
echo memory_get_usage() . "\n"; // 36744

任何人都可以解释为什么在取消设置变量之后内存使用量不会返回到36640

5 个答案:

答案 0 :(得分:5)

如果你这样做两次,记忆将保持在36744 ......

echo memory_get_usage() . "\n"; // 36640
$a = str_repeat("Hello", 4242);
echo memory_get_usage() . "\n"; // 57960
unset($a);
echo memory_get_usage() . "\n"; // 36744
$a = str_repeat("Hello", 4242);
unset($a);
echo memory_get_usage() . "\n"; // -> 36744

答案 1 :(得分:4)

垃圾收集是一项昂贵的操作,即使只有一个变量未设置。每次取消设置var时,PHP都不会运行收集器,因为这会浪费大量的CPU时间。

PHP只会在必要时运行收集器,就像某些东西需要更多内存时一样。

答案 2 :(得分:3)

你的PHP版本是什么?小于5.3版本的垃圾收集器并不是很好。请阅读此链接以了解原因:

Garbage collector

答案 3 :(得分:1)

发布此内容。

我刚刚将它作为PHP 5.3的测试来运行,结果非常明确powtac所说的:

630744
652280
630808
630808
652280
630808
630808
652280
630808
630808
652280
630808
630808
652280
630808
630808
652280
630808

所以,在最初的unset之后,似乎始终如一。代码测试:

while (1) {
        echo memory_get_usage() . "\n"; // 36640
        $a = str_repeat("Hello", 4242);
        echo memory_get_usage() . "\n"; // 57960
        unset($a);
        echo memory_get_usage() . "\n"; // 36744
}

警告:这是一个无限循环:)

答案 4 :(得分:0)

我会尝试给出一个可能的解释,但我不能说它是正确的。

PHP将变量存储在哈希表中(因为它具有动态特性)。该哈希表由“桶”(链接的元素列表)组成。随着元素数量的增加,桶的数量也会增加(确切地说:一旦达到限制,桶的数量就会翻倍)。

因此可能就是这样,你的变量的创建导致了桶的增加。由于这些存储桶不会再次移除,因此内存使用率会保持不变。

但又一次:只是猜测。