概述
内存是每个工程师逃避不了的问题,了解内存管理机制更有助于了解PHP7内存分配的原理,更好的使用PHP7这门语言

PHP7内存管理器:

内存管理器

PHP脚本运行不是直接从系统中申请的,而是调用了Zend Memory Manager (Zend 内存管理器)提供的一系列接口函数来间接申请内存,如果管理器内存够用,直接分配PHP程序,如果不够用,则自动向系统中申请。

PHP7核心代码在zend_alloc.c中实现,一共有三种规格的内存

序号 规格 尺寸
1 Huge(chunk) 申请内存大于2M,直接调用系统分配,分配若干个chunk
2 Large(page) 申请内存大于3K(3/4 page_size),小于2044K(511 page_size),分配若干个page
3 Small(slot) 申请内存小于等于3K(3/4 page_size)

zval的示意图

zend堆结构

Huge分配

也是最大力度的分配这个分配是直接向系统中申请的,但一次会申请多个,有合适了则立即返回内存区域,

Large分配

一个chunk对应512个page,但是第一个page会始终被chunk结构占用着,可用的也就511个page大小。如果申请多个page的话分配的时候这些page都是连续的 。如果直到最后一个chunk也没找到则重新分配一个新的chunk并插入chunk链表,chunk->free_map利用bitmap来记录每组的page的使用情况

Large

slot分配

small内存总共有30种固定大小的规格:8,16,24,32,40,48,56,64,80,96,112,128 … 1792,2048,2560,3072 Byte,这称之为slot,这些slot的大小是有规律的:最小的slot大小为8byte,前8个slot依次递增8byte,后面每隔4个递增值乘以2

slot

php7 内存对齐

PHP7会对是内存进行对齐例如申请300B内存大小的内存,经过内存管理器的申请,加入是256B对齐,当申请300B内存则会拿到512B的内存,申请对其内存应该是对其内存数的整数倍,其中不符合的会将这个不对齐的区域进行释放掉