首页 > 代码库 > php 内存管理
php 内存管理
php的内存管理由zend引擎处理分为三个层次接口层-》heap层-》存储层(malloc)
PHP底层对内存的管理, 围绕着?块内存列表(free_buckets)、 ?块
内存列表(large_free_buckets)和 剩余内存列表(rest_buckets)三个列表来分层进?的。 ZendMM向
系统进?的内存申请,并不是有需要时向系统即时申请, ?是由ZendMM的最底层(heap层)先向系统申
请??块的内存,通过对上?三种列表的填充, 建??个类似于内存池的管理机制。 在程序运?需要使?
内存的时候,ZendMM会在内存池中分配相应的内存供使?。 这样做的好处是避免了PHP向系统频繁的内
存申请操作
ZendMM对内存分配的处理主要有以下步骤:
TIPI:深?理解PHP内核RELEASE_2012-04-04_V0.7.3
1. 内存检查。 对要申请的内存??进?检查,如果太?(超出memory_limit则报 Out of Memory);
2. 如果命中缓存,使?fastcache得到内存块(详见第五节),然后直接进?第5步;
3. 在ZendMM管理的heap层存储中搜索合适??的内存块, 在这?步骤ZendMM通过与
ZEND_MM_MAX_SMALL_SIZE进????较, 把内存请求分为两种类型: large和small。small
类型的的请求会先使?zend_mm_low_bit函数 在mm_heap中的free_buckets中查找,未找到则使
?与large类型相同的?式: 使?zend_mm_search_large_block函数在“?块”内存
(_zend_mm_heap->large_free_buckets)中进?查找。 如果还没有可以满???需求的内存,最
后在rest_buckets中进?查找。 也就是说,内存的分配是在三种列表中?到?进?的。 找到可以使
?的block后,进?第5步;
4. 如果经过第3步的查找还没有找到可以使?的资源(请求的内存过?),需要使?
ZEND_MM_STORAGE_ALLOC函数向系统再申请?块内存(???少为
ZEND_MM_SEG_SIZE),然后直接将对齐后的地址分配给本次请求。跳到第6步;
5. 使?zend_mm_remove_from_free_list函数将已经使?block节点在zend_mm_free_block中移除;
6. 内存分配完毕,对zend_mm_heap结构中的各种标识型变量进?维护,包括large_free_buckets,
peak,size等;
7. 返回分配的内存地址
垃圾回收机制见这个http://blog.csdn.net/phpkernel/article/details/5734743
cow写时复制见这个http://www.laruence.com/2008/09/19/520.html
php 内存管理