PHP:对象数组和内存泄漏

时间:2015-07-09 16:18:59

标签: php memory-leaks

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

 private void loadBundle() {
            Bundle b = getArguments();
            Log.i("tab1", "Check if b != null");
            if (b != null) {
                    String name= b.getString("name");
                    Integer ID= b.getInt("ID");
                    String date= b.getString("date");
                    Log.i("tab1 Übergabe: ", "" + name+ " " + ID+ " " + date);
            }
            else
            {
                    Log.i("tab1", "B = null");
            }
    }

在下一次迭代中,内存仍然结束。 知道如何释放占用的内存吗?

P.S。我尝试unset()/赋值null和gc_collect_cycles(),没有一个方法允许我释放对象数组占用的内存

1 个答案:

答案 0 :(得分: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只是坐在它上面。