首页 > 解决方案 > 清除php v5.6字符串数组时防止内存丢失的最佳方法是什么

问题描述

为了防止内存丢失和内存“瓶颈”,我目前正在使用以下方法在字符串数组中清除/“标记释放”内存:

//
// Clear each of the possibly thousands of long strings contained in the
// $strMAINs array elements and mark them for subsequent memory release.
// No other variables reference the strings in this array.
//

for( $c = ( count( $strMAINs ) - 1 ); $c >= 0; --$c ) {

    $strMAINs[  $c ] = '';
    unset( $strMAINs[  $c ] );

}

//
// Do the same for the overall array, unless the array is to reused before
// the overall code execution is complete.
//

$strMAINs = '';
unset( $strMAINs );

//
// Make an empty array with the same variable name available for subsequent
// use.
//

$strMAINs = [];  // Actually, this isn't needed.  Just don't clear the whole
                 // variable so the array can be reused! 

然而,在上述代码块的末尾,$strMAINs 数组随后被重新分配一个新的空数组,以便该变量准备好用于后续分配

$strMAINs[] = some string value or string variable;

我看到有关此主题的其他问题,建议仅使用unset( $ variable ); ,但随后答案并没有解决数组未设置不会立即释放内存,而是将其推迟到代码执行结束或内存变得足够低以导致垃圾收集发生,我认为后者是性能受到很大影响,因为它必须“寻找”尽可能多的未使用的变量内存,而任何明确“标记为已释放”的变量可能更容易找到,并且如果在被释放后足以消除整体低内存条件将优化垃圾收集操作。

所以,这给我留下了几个问题:

  1. 当将新值分配给元素时,为每个元素分配空字符串''NULL是否真的有帮助?但是,元素的数量不一定相同,可以更少或更多。

  2. 如果元素分配循环确实有用,是否有更好的 PHP 函数/语句来执行相同的操作,即在单个 PHP 解释器处理步骤中内部化整个循环和分配的执行,而不是一系列单独的解释/执行步骤然后单独处理?或者,是$strMAINs = []; 赋值语句最好,不会冒内存丢失的风险,并快速释放旧元素持有的内存,并减少垃圾收集发生时 Web 服务器陷入困境的频率。

谢谢

标签: phparraysmemory-leaks

解决方案


当您将某些内容分配给变量时,如果它是空字符串或空值或空值,则在内存中定义了某些内容。

unset强制立即释放内存。垃圾收集器完成其余的工作。因此,当您有一个数组并想要释放内存时,请取消设置该元素。


推荐阅读