PHP:对象数组和内存泄漏

5

我在从对象数组中导出大量文件时遇到了内存泄漏问题。

简化后的代码如下:

class Test_Class
{
    private $a = null;

    public function __construct($a = null)
    {
        $this->a = $a;
    }

    public function __destruct()
    {
        unset($this->a);
    }
}

print 'Memory before: '.memory_get_usage(1).' <br>'; // 262 144 
$a = [];
for ($i=0; $i<600000; $i++)
    $a[] = new Test_Class($i);

print 'Memory after create: '.memory_get_usage(1).' <br>'; // 129 761 280 

for($i=0; $i < count($a); $i++)
    unset($a[$i]);

unset($a);

print 'Memory after: '.memory_get_usage(1).' <br>'; // 35 389 440 

在下一次迭代中,内存仍然会耗尽。

有什么办法来释放被占用的内存吗?

顺便说一句,我尝试使用unset()/赋值为null以及gc_collect_cycles(),但这些方法都无法释放由对象数组占用的内存。


1
可能是销毁PHP对象的最佳方法?的重复问题。 - Blue
1个回答

0

我不认为这是内存泄漏。内存确实已经释放并可用,但似乎php将其保留供自己使用,而不将其归还给系统。我猜测这与垃圾收集器有关。这似乎是一种不好的行为,但也许有一个好的理由...

这是我的证明: (由于我的配置不同,我使用了较小的值,但行为是相同的)

/*
   You class definition
*/

print 'Memory before: '.memory_get_usage(1).' <br>'; // 262 144 
$a = [];
$b = [];
for ($i=0; $i<5000; $i++)
    $a[] = new Test_Class($i);

print 'Memory after create: '.memory_get_usage(1).' <br>'; // 2 359 296 

for($i=0; $i < count($a); $i++)
    unset($a[$i]);

unset($a);

print 'Memory after unset: '.memory_get_usage(1).' <br>'; // 1 572 864 

for ($i=0; $i<1000; $i++)
    $b[] = $i;

print 'Memory after $b: '.memory_get_usage(1).' <br>'; // 1 572 864 

您可以在这里看到,创建$b并不需要更多的内存。这很奇怪,因为数组在未执行任何操作之前需要内存:

$b = [];

print 'Memory before: '.memory_get_usage(1).' <br>'; // 262 144 

for ($i=0; $i<1000; $i++)
    $b[] = $i;

print 'Memory after: '.memory_get_usage(1).' <br>'; // 524 288 

这就是为什么我认为内存已经被释放,但 PHP 却仍然占用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接