php 内存管理

php的内存管理由zend引擎处理分为三个层次接口层-》heap层-》存储层(malloc)

PHP底层对内存的管理, 围绕着大块内存列表(free_buckets)、 小块
内存列表(large_free_buckets)和 剩余内存列表(rest_buckets)三个列表来分层进行的。 ZendMM向
系统进⾏的内存申请,并不是有需要时向系统即时申请, ⽽是由ZendMM的最底层(heap层)先向系统申
请⼀⼤块的内存,通过对上⾯三种列表的填充, 建⽴⼀个类似于内存池的管理机制。 在程序运⾏需要使⽤
内存的时候,ZendMM会在内存池中分配相应的内存供使⽤。 这样做的好处是避免了PHP向系统频繁的内
存申请操作

ZendMM对内存分配的处理主要有以下步骤:
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

posted @ 2014-12-14 12:42  scu_2008_hike  阅读(299)  评论(0编辑  收藏  举报