PHP是否根据其限制动态处理内存使用情况?

时间:2013-03-31 04:17:17

标签: php memory memory-management

我有一个脚本,当PHP的memory_limit在运行时间大约25秒时设置为50M时成功运行。当我在脚本末尾打印memory_get_peak_usage时,它与50M非常接近。当我将memory_limit设置得更高时,90Mmemory_get_peak_usage显示75M左右,脚本加载速度提高约10秒。

看起来直观的是,无论memory_limit如何,脚本都会使用大约相同数量的内存,但似乎并非如此。如果脚本最大不超过50M且限制为50M,我原本预计即使memory_limit已增加,峰值使用率也会相同。

我唯一的解释是PHP识别它接近极限并花费时间清除未使用的内存以避免达到限制。这是它实际上是如何工作的还是我只是划破了更大的表面?

2 个答案:

答案 0 :(得分:2)

你看到的是垃圾收集器正在发挥作用。

重新定义非原始变量值时,旧值不会立即从内存中丢弃。它仍然存在,作为脚本内存使用的一部分。

只有当您的脚本危险地接近其内存限制时,才会调用垃圾收集器来清理那些未使用的已分配内存,以便为脚本释放更多空间。这个过程非常顺畅,这就是为什么脚本运行速度更快,内存更多 - 垃圾收集器不需要经常使用。

编辑:

缓冲也参与其中。如果您的脚本正在向文件写入大量数据,则此数据首先在内存中排队,因为您的硬盘将无法像生成此数据那样快速地写入此数据。如果生成数据的速度比磁盘写入速度快得多,最终可用内存将会填满,下次尝试fwrite()或使用任何将数据放入缓冲区的函数时,程序将被强制等待。 / p>

答案 1 :(得分:1)

我找不到这方面的硬证明但是我记得/相信memory_limit设置php将使用每个脚本的内存量vs memory_get_peak_usage显示你的脚本分配的内存(php的开销量略有差异)用来管理自己)

来自memory_get_peak_usage

上的手册
  

参数

     

real_usage

     

将此值设置为TRUE以获取从系统分配的实际内存大小。如果未设置或FALSE,则仅报告emalloc()使用的内存。