一、php内存管理概述——Zendengine由于计算机的内存是由操作系统管理的,所以普通的应用程序无法直接访问内存。应用程序只能向操作系统申请内存,普通应用程序也是如此。在需要的时候,它们通过像malloc这样的库函数向操作系统申请内存。在一些对性能要求较高的应用场景中,需要频繁使用和释放内存,如Web服务器、编程语言等,因为向操作系统申请内存空间会引起系统调用、系统调用和普通应用层functioncalls性能差异非常大,因为系统调用会将CPU从用户态切换到内核,因为涉及物理内存的操作只能由操作系统执行,而这种切换的成本非常高,如果频繁的在内核态和用户态之间切换会导致性能问题。鉴于系统调用的开销,一些对性能有要求的应用程序通常会在用户态自行进行内存管理。例如,第一次申请稍大的内存是预留备份的,释放的内存在使用后不会立即归还给操作系统。内存可以重复使用,可以避免多次内存申请和释放带来的性能消耗。PHP不需要显式管理内存,这些任务由Zend引擎管理。PHP内部有一个内存管理系统,会自动释放不再使用的内存垃圾。2.在php中查看和设置内存相关的参数和函数来配置内存大小:(1)可以在php.ini中修改配置memory_limit=32M(2)如果环境中没有禁用ini_set()函数,则可以通过这个函数设置:ini_set("memory_limit","128M");查看内存状态:(1)memory_get_usage(),该函数的作用是获取当前PHP脚本使用的内存大小。(2)memory_get_peak_usage(),该函数的作用是返回当前脚本占用内存的峰值到当前位置,从而可以获取当前脚本的内存需求。3.ZendMM内存分配和销毁PHP的底层内存管理围绕三个列表分层:小内存列表(free_buckets)、大内存列表(large_free_buckets)和剩余内存列表(rest_buckets)。ZendMM向系统申请内存并不是在需要的时候立即向系统申请,而是ZendMM的底层(堆层)先向系统申请一大块内存,通过填充上面三个链表建立内存。类似于内存池的管理机制。当程序需要使用内存时,ZendMM会在内存池中分配相应的内存以供使用。这样做的好处是避免了PHP对系统频繁的内存申请操作。ZendMM在内存销毁的处理上采用了和内存申请一样的策略。当程序unset一个变量或其他释放行为时,ZendMM不会立即直接将内存归还给系统,而只会在自己维护的内存池中。Remarkitasavailablein,并根据内存的大小将其排序到上面提到的三个列表(small,large,free)中,以备下次内存申请。具体详情请参考:http://www.php-internals.com/...
