简单理解PHP内存机制

    首先要理解PHP的内存分配是一次性向系统申请开辟的,PHP自身有个内存管理池,每次申请内存都会先在管理池中寻找合适的内存块,找不到才向系统申请内存,因此,脚本运行的时间越长(例如守护进程运行的脚本),PHP占有的内存也就越大,所以及时释放内存很重要(PHP5.3后引入新的垃圾回收机制),释放后的内存不交回给系统,而是放在内存管理池中继续使用;但是,PHP这种机制可以有效避免了频繁向系统申请内存,减少对OS的请求次数(PHP预定义常量变量多)。

    PHP的内存管理可以看作为三层,从上到下分别为:接口层(emalloc、efree),堆层(heap),存储层(storge)。

    堆层是PHP内存管理机制的核心,而真正向系统申请内存的是存储层(malloc()、mmap()申请、efree()释放)。堆层通过调用存储层的内存分配方法时,是以大块大块的方式申请内存,存储层的作用是将内存分配的方式对堆层透明化

    刚才上面说堆层是PHP内存管理机制的核心,其实PHP底层的内存管理,是围绕着3块内存列表来分层进行的:小块内存列表(free_buckets)、大块内存列表(large_free_buckets)、剩余内存列表(rest_buckets)。堆层先向系统申请一大块内存,通过对三块列表的填充,建立起了类似内存管理池的机制。因此,在程序运行需要使用内存的时候,内存池就会分配相应的内存提供使用。

    当程序unset一个变量或者是其他的释放行为时,ZendMM并不会直接立刻将内存交回给系统,而是只在自身维护的内存管理池(存储层)中将其重新标识为可用, 按照内存的大小整理到上面所说的三种列表(small,large,free)之中,以备下次内存申请时使用。

    内存分配流程如下:

1、先检查内存。即对申请的内存大小进行检查,如果太大则报错;

2、检查是否命中缓存,如果命中,则在cache中得到内存块,跳到第5步;

3、如果没有命中缓存,则在内存管理池中搜索合适大小的内存块(堆层),分为两种类型:小块查找和大块查找。先在小块内存列表中寻找是否有合适的内存块;然后在大块内存列表中查找;最后才在剩余内存列表中寻找。若找到满足大小需求的内存块之后使用block,进行第5步;若没有找到合适的内存块,则继续下面的步骤;

4、经过第3步的查找仍然还没有找到合适的内存块(可能申请的内存过大,但又没超过限制),堆层调用存储层的函数再向系统申请一块内存,然后将对齐后的地址分配给本次请求。跳到第6步;

5、使用zend_mm_remove_from_free_list函数将已经使用block节点在zend_mm_free_block中移除;

6、内存分配完毕,对堆层结构中的各种标识型变量进行维护。

7、返回内存分配地址。

转载:https://blog.csdn.net/ty_hf/article/details/52905896

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值