概述
内存是每个工程师逃避不了的问题,了解内存管理机制更有助于了解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的示意图
Huge分配
也是最大力度的分配这个分配是直接向系统中申请的,但一次会申请多个,有合适了则立即返回内存区域,
Large分配
一个chunk对应512个page,但是第一个page会始终被chunk结构占用着,可用的也就511个page大小。如果申请多个page的话分配的时候这些page都是连续的 。如果直到最后一个chunk也没找到则重新分配一个新的chunk并插入chunk链表,chunk->free_map利用bitmap来记录每组的page的使用情况
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
php7 内存对齐
PHP7会对是内存进行对齐例如申请300B内存大小的内存,经过内存管理器的申请,加入是256B对齐,当申请300B内存则会拿到512B的内存,申请对其内存应该是对其内存数的整数倍,其中不符合的会将这个不对齐的区域进行释放掉