无法通过在for循环中创建和插入对象来释放内存

时间:2013-09-02 15:34:00

标签: php memory-leaks

我正在运行一个循环,它创建一个对象(创建一些数组),然后在循环中取消它:

private function _runLoop($amountPerStep = 4){
    $steps = floor(count($this->_symbolRows)/$amountPerStep);
    $echo = "";
    for($i = 0; $i <= $steps; $i++){
        $tempSymbolRows = array_slice($this->_symbolRows,$i*$amountPerStep,($i+1)*$amountPerStep);
        if (count($tempSymbolRows) == 0) continue;
        $tempSymbols    = array();
        for($j = 0; $j < count($tempSymbolRows); $j++){
            $tempSymbols[] = $tempSymbolRows[$j][0];
        }
        $scrapping = new Scraping($tempSymbols);
        $echo .= "<pre>";
        $echo .= "memory_peak_usage / memory_usage <br/>";
        $echo .= memory_get_peak_usage()/1000000 ." / ". memory_get_usage() / 1000000 ."<br/><br/>";
        //print_r($scrapping->getArrays());
        $echo .= "</pre>";
        $scrapping = NULL;
        unset($scrapping);
        gc_collect_cycles();
        if( $i >= 3 ) break;
    }
    echo $echo;
}

在第三次运行后,在lop中打破循环(测试目的)。我注释掉了我打印循环数组的行,因为它会通过保存打印数组来占用内存(即使对象不存在)。认为这将是问题。但是当我运行循环时,我得到了这个输出

memory_peak_usage / memory_usage 
7.805928 / 1.530504

memory_peak_usage / memory_usage 
9.723464 / 6.28792

memory_peak_usage / memory_usage 
39.414088 / 17.227368

memory_peak_usage / memory_usage 
55.541584 / 23.166608

所以使用的内存大小越来越大...... 哪里出错了? 为什么gc没有释放资源?

1 个答案:

答案 0 :(得分:1)

取自评论中的讨论。

$tempSymbolRows = array_slice($this->_symbolRows,$i*$amountPerStep,($i+1)*$amountPerStep);

此行在每个循环中创建一个更大的数组,因为array_splice的第三个参数不是偏移量。这会导致内存使用量增加。