php5.6.19中的内存泄漏

时间:2016-05-10 16:19:06

标签: php arrays memory-leaks

谁能解释5.6.19的行为。 是以下代码:

<?php
function convert($size)
{
    $unit=array('b','kb','mb','gb','tb','pb');
    return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}

function example()
{
    $a = [];
    $k = 0;
    while($k <= 100000)
    {
        $a[$k] =  mt_rand();
        //$a[$k] =  trim(mt_rand());
        $k++;
        //unset($a);
    }
    //mt_rand();
    //trim('');
    //$mem = memory_get_usage(true);
    //echo $mem.' '.convert($mem).PHP_EOL;
    unset($a);
    trim('');
    $mem = memory_get_usage(true);
    echo $mem.' '.convert($mem).PHP_EOL;
}

example();
example();
example();
example();
example();
echo PHP_EOL;
$mem = memory_get_usage(true);
echo $mem.' '.convert($mem);

我们称之为功能&#34;示例&#34;是5次。它生成一个包含100,000个元素的数组。 在生成数组之后,在&#34; unset&#34;之前,我们调用trim。 记忆表现:

786432 768 kb
786432 768 kb
1048576 1 mb
1310720 1.25 mb
1572864 1.5 mb

1572864 1.5 mb

生成数组后,在&#34; unset&#34;之前,我们调用mt_rand。 记忆表现:

786432 768 kb
1048576 1 mb
1310720 1.25 mb
1310720 1.25 mb
1310720 1.25 mb

1048576 1 mb

在生成数组之后,在&#34; unset&#34;之前,我们调用&#34; mt_rand&#34;,并包装&#34; mt_rand&#34;的数组值。 in&#34; trim&#34;。 记忆表现:

524288 512 kb
524288 512 kb
524288 512 kb
524288 512 kb
524288 512 kb

524288 512 kb

生成数组后,在&#34; unset&#34;之前,我们调用memory_get_usage。 记忆表现:

786432 768 kb
1048576 1 mb
1310720 1.25 mb
1572864 1.5 mb
1572864 1.5 mb

1572864 1.5 mb

生成数组后,在&#34; unset&#34;之前,我们不会调用任何内容。 记忆表现:

524288 512 kb
524288 512 kb
524288 512 kb
524288 512 kb
524288 512 kb

524288 512 kb

代码运行于:

$ php5 -v
PHP 5.6.19-1+deb.sury.org~trusty+1 (cli) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
    with blackfire v1.10.0, https://blackfire.io, by Blackfireio Inc.

P.S

当你为数组的值添加一个强制转换(字符串)时,我们得到:

1310720 1.25 mb
1310720 1.25 mb
1572864 1.5 mb
1835008 1.75 mb
1835008 1.75 mb

1835008 1.75 mb

示例代码:

<?php
function convert($size)
{
    $unit=array('b','kb','mb','gb','tb','pb');
    return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}

function example()
{
    $a = [];
    $k = 0;
    while($k <= 100000)
    {
        $a[$k] =  (string)mt_rand();
        $k++;
    }
    unset($a);
    $mem = memory_get_usage(true);
    echo $mem.' '.convert($mem).PHP_EOL;
}

example();
example();
example();
example();
example();
echo PHP_EOL;
$mem = memory_get_usage(true);
echo $mem.' '.convert($mem);

while(true)
{
    sleep(10);
}

当你将一个cast(int)添加到数组的值时,我们得到:

786432 768 kb
1048576 1 mb
1310720 1.25 mb
1572864 1.5 mb
1572864 1.5 mb

1572864 1.5 mb

示例代码:

<?php
function convert($size)
{
    $unit=array('b','kb','mb','gb','tb','pb');
    return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}

function example()
{
    $a = [];
    $k = 0;
    while($k <= 100000)
    {
        $a[$k] =  (int)mt_rand();
        $k++;
    }
    unset($a);
    $mem = memory_get_usage(true);
    echo $mem.' '.convert($mem).PHP_EOL;
}

example();
example();
example();
example();
example();
echo PHP_EOL;
$mem = memory_get_usage(true);
echo $mem.' '.convert($mem);

while(true)
{
    sleep(10);
}

P.S.S

至于我,这是由于变量及其类型。 另一个例子:

<?php
function convert($size)
{
    $unit=array('b','kb','mb','gb','tb','pb');
    return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}

function example()
{
    $a = [];
    for($k = 0; $k<=100000; $k++)
    {
        $b = mt_rand();
        $a[$k] = (string)$b;
        //unset($b);
    }
    unset($a);
    $mem = memory_get_usage(true);
    echo $mem.' '.convert($mem).PHP_EOL;
}

for($a = 0; $a<=5; $a++)
{
    example();
}

echo PHP_EOL;
$mem = memory_get_usage(true);
echo $mem.' '.convert($mem);

while(true)
{
    sleep(10);
}

性能:

1310720 1.25 mb
1835008 1.75 mb
1572864 1.5 mb
1835008 1.75 mb
1835008 1.75 mb
2097152 2 mb

1835008 1.75 mb (If the code is run more than ~200 times - the maximum memory usage 12.75MB) 

但是如果我删除变量&#34; $ b&#34;

<?php
function convert($size)
{
    $unit=array('b','kb','mb','gb','tb','pb');
    return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}

function example()
{
    $a = [];
    for($k = 0; $k<=100000; $k++)
    {
        $b = mt_rand();
        $a[$k] = (string)$b;
        unset($b);
    }
    unset($a);
    $mem = memory_get_usage(true);
    echo $mem.' '.convert($mem).PHP_EOL;
}

for($a = 0; $a<=5; $a++)
{
    example();
}

echo PHP_EOL;
$mem = memory_get_usage(true);
echo $mem.' '.convert($mem);

while(true)
{
    sleep(10);
}

结果:

524288 512 kb
524288 512 kb
524288 512 kb
524288 512 kb
524288 512 kb
524288 512 kb

524288 512 kb

P.S.S.S

在php7中 - 一切正常。

0 个答案:

没有答案