从对象数组导出大量文件时,我遇到内存泄漏问题.简化代码如下所示:
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
Run Code Online (Sandbox Code Playgroud)
在下一次迭代中,内存仍然结束.知道如何释放占用的内存吗?
PS我尝试unset()/赋值null和gc_collect_cycles(),没有一个方法允许我释放对象数组占用的内存
小智 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
Run Code Online (Sandbox Code Playgroud)
您可以看到这里的创建$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
Run Code Online (Sandbox Code Playgroud)
这就是为什么我认为内存已被释放,但 php 只是坐在上面。