Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php5.6.19中的内存泄漏_Php_Arrays_Memory Leaks - Fatal编程技术网

php5.6.19中的内存泄漏

php5.6.19中的内存泄漏,php,arrays,memory-leaks,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 <=

谁能解释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);
在生成数组之后,在“unset”之前,我们调用mt_rand。 内存性能:

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

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

1048576 1 mb
524288 512 kb
524288 512 kb
524288 512 kb
524288 512 kb
524288 512 kb

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

1572864 1.5 mb
524288 512 kb
524288 512 kb
524288 512 kb
524288 512 kb
524288 512 kb

524288 512 kb
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) 
生成数组后,在“unset”之前,我们调用“mt_rand”,并将“mt_rand”的数组值包装在“trim”中。 内存性能:

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

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

1048576 1 mb
524288 512 kb
524288 512 kb
524288 512 kb
524288 512 kb
524288 512 kb

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

1572864 1.5 mb
524288 512 kb
524288 512 kb
524288 512 kb
524288 512 kb
524288 512 kb

524288 512 kb
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) 
在生成数组之后,在“unset”之前,我们调用memory\u get\u usage。 内存性能:

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

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

1048576 1 mb
524288 512 kb
524288 512 kb
524288 512 kb
524288 512 kb
524288 512 kb

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

1572864 1.5 mb
524288 512 kb
524288 512 kb
524288 512 kb
524288 512 kb
524288 512 kb

524288 512 kb
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) 
在生成数组之后,在“unset”之前,我们不调用任何东西。 内存性能:

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

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

1048576 1 mb
524288 512 kb
524288 512 kb
524288 512 kb
524288 512 kb
524288 512 kb

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

1572864 1.5 mb
524288 512 kb
524288 512 kb
524288 512 kb
524288 512 kb
524288 512 kb

524288 512 kb
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) 
代码运行于:

$ 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
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] =  (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);
}
<?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);
}
示例代码:

<?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);
}
<?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);
}
但是如果我去掉变量“$b”

p.S.S.S


在php7中-一切正常。

我认为您无法可靠地检测到这样的内存泄漏。首先,memory_get_usage(true)返回分配的内存,该内存可能比实际使用的内存多,即尚未释放到操作系统。另外,unset不保证对象的内存会立即释放,因为这是由垃圾收集器管理的。即使没有引用,集合也可能不会立即启动,请注意,完全不相关的函数调用(如trim(“”)影响结果似乎确认测量已关闭。您是对的,但仍然很奇怪。上一次的实验稍微重写了一遍,以便他一直重复(并添加了gc_collect_cycles()),间隔10秒,然后重复,但已经查看了证据htop。RES-当我没有删除变量时,变量停止在~30580。重复实验删除一个变量:~20752,尽管与给出的内存使用率(true)的数字相比,差异很大;我认为您无法可靠地检测到这样的内存泄漏。首先,memory_get_usage(true)返回分配的内存,该内存可能比实际使用的内存多,即尚未释放到操作系统。另外,unset不保证对象的内存会立即释放,因为这是由垃圾收集器管理的。即使没有引用,集合也可能不会立即启动,请注意,完全不相关的函数调用(如trim(“”)影响结果似乎确认测量已关闭。您是对的,但仍然很奇怪。上一次的实验稍微重写了一遍,以便他一直重复(并添加了gc_collect_cycles()),间隔10秒,然后重复,但已经查看了证据htop。RES-当我没有删除变量时,变量停止在~30580。重复实验删除一个变量:~20752,尽管与给出的内存使用率(true)的数字相比,差异很大;