代码之家  ›  专栏  ›  技术社区  ›  sami_analyst

无法通过在for循环中创建和取消设置对象来释放内存

  •  0
  • sami_analyst  · 技术社区  · 13 年前

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

    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中第三次运行后,im打破了循环(测试目的)。我注释掉了打印循环数组的那一行,因为它会因为保存数组用于打印而占用内存(即使对象不存在)。我认为这就是问题所在。但当我运行循环时,我得到了这个输出

    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 回复  |  直到 13 年前
        1
  •  2
  •   Jim    13 年前

    摘自评论中的讨论。

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

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