PHP内核研究(内存管理1)

WBOY
Freigeben: 2016-06-23 13:02:43
Original
753 Leute haben es durchsucht

PHP内存管理

  • PHP在5.3之前采用的是引用计数法
  • PHP在5.3之后采用了新的垃圾回收机制
  • 操作系统在申请内存空间的时候回引发系统调用

  • 在操作系统申请内存空间的时候,会将CPU从用户态切换到内核态,切换成本很高(会导致性能问题)
  • PHP的默认最大内存使用时32M
    在php.ini中

    memory_limit=32M
    Nach dem Login kopieren

    或者采用动态方式修改最大内存:

    <?phpini_set("memory_limit","128M");     //修改内存为128M>
    Nach dem Login kopieren

  • 获取目前内存使用情况

    memory_get_usage()          //目前PHP脚本所用的内存大小memory_get_peak_usage()     //返回当前位置占用内存峰值,这样就可以知道内存峰值autoload()                  //避免一次性包含不一定会使用的类
    Nach dem Login kopieren

  • PHP的内存分布和管理

    |应用层Applecation||||
    |-----|||
    | 接口层 Emalloc/efree|堆层Heap|存储层Storange||
    |malloc|win32|mmap_anon|mmap_zero|

  • 存储层:使用malloc和mmap向系统真正的申请空间,使用free函数释放
  • 控制层:控制整个内存管理的过程(控制层PHP内存管理的核心)
  • 使用宏定义来实现上层和下层分离(门面模式)
  • 内存管理

  • 初始化:

    zend_mm_startup();      //初始化存储层zend_mm_startup_ex();   //初始化堆层ZEND_MM_SEG_SIZE    //默认256*1024ZEND_MM_SEG_SIZE    //默认的内存分配方案4种
    Nach dem Login kopieren

  • PHP内存维护3个列表
    1. 小块内存表:free_buckets
    2. 大块内存表:larg_free_buckets
    3. 剩余内存表:rest_buckets

      前两个为HashTable,每个HashTable都有自己的哈希函数。

    Verwandte Etiketten:
    Quelle:php.cn
    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage