前言:

PHP在运行时所需的内存,是一次性向操作系统申请开辟的,而不是分多次。那他是怎么样一次性申请呢,机制又是如何?请看下边介绍。

heap层是PHP内存管理的核心实现,PHP底层对内存的管理, ZendMM向系统进行的内存申请,并不是有需要时向系统即时申请, 而是由ZendMM的最底层(heap层)先向系统申请一大块的内存, 建立一个类似于内存池的管理机制,unset后,ZendMM并不会直接立刻将内存交回给系统,而是只在自身维护的内存池(storge层)中将其重新标识为可用,。

优点:

1.预定义常量变量多,对内存的请求有数百次,避免了PHP向系统频繁的内存申请操作,减少了对OS的请求次数。

2.运行速度会更快,缺点是随着程序的运行时间的变长,内存使用越来越多,所以5.3引入新垃圾回收机制。

详细分析如下:


PHP内核--探究内存管理与缓存机制的图文详解-LMLPHP

PHP内核--探究内存管理与缓存机制的图文详解-LMLPHP


图6.1 PHP内存管理器


一.内存的申请

PHP内核--探究内存管理与缓存机制的图文详解-LMLPHP

<?php
  $tipi = "o_o\n";
  echo $tipi;
?>
登录后复制

在编写PHP的扩展时,推荐使用emalloc(申请的是zend_mm_storage层的内存块)来代替malloc(申请的是操作系统的内存块),其实也就是使用PHP的ZendMM来代替 手动直接调用系统级的内存管理。


ZendMM使用_zend_mm_alloc_int函数进行内存分配,流程如下:

PHP内核--探究内存管理与缓存机制的图文详解-LMLPHP

PHP内核--探究内存管理与缓存机制的图文详解-LMLPHP


二.内存的销毁

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


三.缓存

在维基百科中有这样一段描述: 凡是位于速度相差较大的两种硬件之间的,用于协调两者数据传输速度差异的结构,均可称之为Cache。 从最初始的处理器与内存间的Cache开始,都是为了让数据访问的速度适应CPU的处理速度, 其基于的原理是内存中“程序执行与数据访问的局域性行为”。 同样PHP内存管理中的缓存也是基于“程序执行与数据访问的局域性行为”的原理。 引入缓存,就是为了减少小块内存块的查询次数(查询前先看是否能命中缓存),为最近访问的数据提供更快的访问方式。

PHP将缓存添加到内存管理机制中做了如下一些操作:

·标识缓存和缓存的大小限制,即何时使用缓存,在某些情况下可以以最少的修改禁用掉缓存

·缓存的存储结构,即缓存的存放位置、结构和存放的逻辑

·初始化缓存

·获取缓存中内容

·写入缓存

释放缓存或者清空缓存列表

缓存本身也是存储在storage层申请的内存中的,如果内存都不够用了,那就得释放缓存啦。

当堆的内存溢出时,程序会调用zend_mm_free_cache释放缓存中。整个释放的过程是一个遍历数组, 对于每个数组的元素程序都遍历其所在链表中在自己之前的元素,执行合并内存操作,减少堆结构中缓存计量数字


以上就是PHP内核--探究内存管理与缓存机制的图文详解的详细内容,更多请关注Work网其它相关文章!

08-30 15:22