php的内存管理器是分层(hierarchical)的。这个管理器共有三层:存储层(storage)、堆(heap)层和 emalloc/efree 层。存储层通过 malloc()、mmap() 等函数向系统真正的申请内存,并通过free()函数释放所申请的内存。

存储层通常申请的内存块都比较大,这里申请的内存大并不是指storage层结构所需要的内存大,只是堆层通过调用存储层的分配方法时,其以段的格式申请的内存比较大,存储层的作用是将内存分配的方式对堆层透明化。

首先看storage层的结构:

/* Heaps with user defined storage */

typedef struct _zend_mm_storage zend_mm_storage;

http://www.gaodaima.com/50936.html内存详解: 详解PHP内存池中的存储层_php

typedef struct _zend_mm_segment {

size_t    size;

struct _zend_mm_segment *next_segment;

} zend_mm_segment;

typedef struct _zend_mm_mem_handlers {

const char *name;

zend_mm_storage* (*init)(void *params);    //初始化函数

void (*dtor)(zend_mm_storage *storage);    //析构函数

void (*compact)(zend_mm_storage *storage);

zend_mm_segment* (*_alloc)(zend_mm_storage *storage, size_t size);    //内存分配函数

zend_mm_segment* (*_realloc)(zend_mm_storage *storage, zend_mm_segment *ptr, size_t size);    //重新分配内存函数

void (*_free)(zend_mm_storage *storage, zend_mm_segment *ptr);    //释放内存函数

} zend_mm_mem_handlers;

struct _zend_mm_storage {

const zend_mm_mem_handlers *handlers;    //处理函数集

void *data;

};

内存的分配方式,调用的函数是_zend_mm_storage结构中的处理函数集,而内存是以段的形式表现的。

4种内存方案

PHP在存储层共有4种内存分配方案: malloc,win32,mmap_anon,mmap_zero。默认使用malloc分配内存,如果设置了ZEND_WIN32宏,则为windows版本,调用HeapAlloc分配内存,剩下两种内存方案为匿名内存映射,并且PHP的内存方案可以通过设置变量来修改。

官方说明如下:

The Zend MM can be tweaked using ZEND_MM_MEM_TYPE and ZEND_MM_SEG_SIZE environment variables. Default values are “malloc” and “256K”.Dependent on target system you can also use “mmap_anon”, “mmap_zero” and “win32″ storage managers.

在代码中,对于这4种内存分配方案,分别对应实现了zend_mm_mem_handlers中的各个处理函数。配合代码的简单说明如下:

/* 使用mmap内存映射函数分配内存 写入时拷贝的私有映射,并且匿名映射,映射区不与任何文件关联。*/

# define ZEND_MM_MEM_MMAP_ANON_DSC {"mmap_anon", zend_mm_mem_dummy_init, zend_mm_mem_dummy_dtor, zend_mm_mem_dummy_compact, zend_mm_mem_mmap_anon_alloc, zend_mm_mem_mmap_realloc, zend_mm_mem_mmap_free}   本文链接http://www.cxybl.com/html/wlbc/Php/20130922/40142.html

欢迎大家阅读《内存详解: 详解PHP内存池中的存储层_php》,跪求各位点评,若觉得好的话请收藏本文,by 搞代码

微信 赏一包辣条吧~

支付宝 赏一听可乐吧~

php 内存池,内存详解: 详解PHP内存池中的存储层_php相关推荐

  1. LwIP 之六 详解内存池(memp.c/h)动态内存管理策略

      对于嵌入式开发来说,内存管理及使用是至关重要的,内存的使用多少.内存泄漏等时刻需要注意!合理的内存管理策略将从根本上决定内存分配和回收效率,最终决定系统的整体性能.LwIP 就提供了 动态内存堆管 ...

  2. java 句柄池_深入理解JVM之Java对象的创建、内存布局、访问定位详解

    本文实例讲述了深入理解JVM之Java对象的创建.内存布局.访问定位.分享给大家供大家参考,具体如下: 对象的创建 一个简单的创建对象语句Clazz instance = new Clazz();包含 ...

  3. JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)

    JVM(Java虚拟机) JVM 内存模型 结构图 jdk1.8 结构图(极简) jdk1.8 结构图(简单) JVM(Java虚拟机): 是一个抽象的计算模型. 如同一台真实的机器,它有自己的指令集 ...

  4. Java内存模型(JMM)详解-可见性volatile

    这里写自定义目录标题 Java内存模型(JMM)详解-可见性 什么是JMM JMM存在的意义 为什么示例demo中不会打印 i 的值 如何解决可见性问题 **深入理解JMM内存模型** JAVA内存模 ...

  5. 三星服务器内存条型号区分,三星内存铭牌详解|三星内存条标签内存参数详解...

    三星内存铭牌详解|三星内存条标签内存参数详解 大多数朋友都清楚内存铭牌上,记录着内存的重要数据.但是大多数朋友都对此不甚了然!为此小编也想学习下,现在把相关的学习笔记分享出来,希望和朋友们显摆下,小编 ...

  6. 共享内存映射之mmap()函数详解

    转 共享内存映射之mmap()函数详解 /span> 查看全文 http://www.taodudu.cc/news/show-3175071.html 相关文章: 子集生成(二进制法,逐步生成 ...

  7. 内存测试工具memtester使用详解

    memtester的下载地址:http://pyropus.ca/software/memtester/  有源码安装包.deb包.rpm包等. 源码已经编译好,在linux下只要make一下就好了. ...

  8. 阿里云AMD服务器ECS计算型c7a、通用型g7a和内存型r7a性能参数详解

    阿里云第二代AMD服务器ECS计算型c7a.通用型g7a和内存型r7a实例,CPU采用2.55 GHz主频的AMD EPYCTM MILAN处理器,单核睿频最高3.5 GHz,算力更强,云服务器吧详细 ...

  9. 内存和CPU匹配方法详解

    目录 1.内存和CPU的有关数据 2.内存跟CPU搭配的基本原则 3.在Intel平台实现频率同步的方法 4.在Intel平台实现带宽相等的计算方法 5.在Intel平台用主板调控内存运行参数的方法 ...

最新文章

  1. GMIS 2017大会Saman Farid演讲:人工智能时代创业者面对的挑战和机会
  2. java元婴期(18)----java进阶(spring(2)----DI(依赖注入)基于注解的IOC与DI配置properties)
  3. (Mybatis)使用注解开发
  4. python迭代器与生成器_Python的迭代器和生成器
  5. 腾讯云副总裁答治茜:移动互联网破局要借助“三张网”
  6. 信息学奥赛一本通(1093:计算多项式的值)
  7. vue 指令 v-if v-else-if v-else
  8. mysql语句命令_MySQL语句和命令大全
  9. itk_option
  10. 20个开发人员非常有用的Java功能代码(一)
  11. python 简明教程
  12. HowNet介绍及相关API的使用方法
  13. 社区发现算法————总结
  14. 咪蒙注销后,我用Python对其1013篇历史文章做了一次深度的数据分析...
  15. Scrapy爬虫框架,入门案例(非常详细)
  16. 2008年度中国最佳MBA排行榜
  17. oracle 表字段拆分,oracle 字段拆分
  18. Mysql占用CPU过高排查过程及可能优化方案
  19. pr制作节奏感抖动(变换)
  20. 让你一步步成为运维专家之各种运维脚本

热门文章

  1. 什么是Java中的守护程序线程?
  2. 为什么不能在字符串上使用switch语句?
  3. cf烟雾头怎么调win7系统
  4. CRT远程工具连接服务器CentOS
  5. 双亲委托类加载机制_图解JVM类加载机制和双亲委派模型
  6. python获取本地时间并向服务器发送udp报文_python3通过udp实现组播数据的发送和接收操作...
  7. JAVA:json解析
  8. paramiko模块_玩转网络自动化之Netmiko模块
  9. python编写命令行框架_使用 Python 和 Click 编写命令行应用程序
  10. 开源linux 二进制工具,谷歌开源二进制文件对比工具 BinDiff