php中的内存管理

1、php内存管理概述——Zend引擎

  1. 因为计算机的内存由操做系统进行管理,因此普通应用程序是没法直接对内存进行访问的。
  2. 应用程序只能向操做系统申请内存,一般的应用也是这么作的,在须要的时候经过相似malloc之类的库函数 向操做系统申请内存。
  3. 在一些对性能要求较高的应用场景下是须要频繁的使用和释放内存的, 好比Web服务器,编程语言等,因为向操做系统申请内存空间会引起系统调用, 系统调用和普通的应用层函数调用性能差异很是大,由于系统调用会将CPU从用户态切换到内核, 由于涉及到物理内存的操做,只有操做系统才能进行,而这种切换的成本是很是大的, 若是频繁的在内核态和用户态之间切换会产生性能问题。
  4. 鉴于系统调用的开销,一些对性能有要求的应用一般会本身在用户态进行内存管理, 例如第一次申请稍大的内存留着备用,而使用完释放的内存并非立刻归还给操做系统, 能够将内存进行复用,这样能够避免屡次的内存申请和释放所带来的性能消耗。
  5. PHP不须要显式的对内存进行管理,这些工做都由Zend引擎进行管理了。PHP内部有一个内存管理体系, 它会自动将再也不使用的内存垃圾进行释放。

2、php中查看与设置内存的相关参数与函数

  1. 配置内存大小:php

    (1)php.ini中能够更改配置memory_limit = 32M
    (2)若环境中没有禁用ini_set()函数,能够经过此函数设置:ini_set("memory_limit", "128M");
  2. 查看内存状况:编程

    (1)memory_get_usage(),这个函数的做用是获取 目前PHP脚本所用的内存大小。
    (2)memory_get_peak_usage(),这个函数的做用返回 当前脚本到目前位置所占用的内存峰值,这样就可能获取到目前的脚本的内存需求状况。

3、ZendMM内存分配和销毁

  1. PHP底层对内存的管理, 围绕着小块内存列表(free_buckets)、 大块内存列表(large_free_buckets)和 剩余内存列表(rest_buckets)三个列表来分层进行的。
  2. ZendMM向系统进行的内存申请,并非有须要时向系统即时申请, 而是由ZendMM的最底层(heap层)先向系统申请一大块的内存,经过对上面三种列表的填充, 创建一个相似于内存池的管理机制。
  3. 在程序运行须要使用内存的时候,ZendMM会在内存池中分配相应的内存供使用。 这样作的好处是避免了PHP向系统频繁的内存申请操做。
  4. ZendMM在内存销毁的处理上采用与内存申请相同的策略,当程序unset一个变量或者是其余的释放行为时, ZendMM并不会直接马上将内存交回给系统,而是只在自身维护的内存池中将其从新标识为可用, 按照内存的大小整理到上面所说的三种列表(small,large,free)之中,以备下次内存申请时使用。
  5. 具体的详情可参考:http://www.php-internals.com/...
相关文章
相关标签/搜索