gpt4 book ai didi

PHP:对象数组和内存泄漏

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:49:52 24 4
gpt4 key购买 nike

我在从对象数组导出大量文件时遇到内存泄漏问题。简化的代码如下所示:

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()/assignment null和gc_collect_cycles(),没有一个方法允许我释放对象数组占用的内存

最佳答案

我认为这不是内存泄漏。内存确实已释放并可用,似乎 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 只是停留在上面的原因。

关于PHP:对象数组和内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31323010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com