PHP的内存管理, 分为俩大部分, 第一部分是PHP自身的内存管理, 这部分主要的内容就是引用计数, 写时复制, 等等面向应用的层面的管理. 而第二部分就是今天我要介绍的, zend_alloc中描写的关于PHP自身的内存管理, 包括它是如何管理可用内存, 如何分配内存等.
另外, 为什么要写这个呢, 因为之前并没有任何资料来介绍PHP内存管理中使用的策略, 数据结构, 或者算法. 而在我们平时开发扩展, 修复PHP的bug的时候, 却对这一部分的知识需要有一个良好的理解. PHP开发组内的很多朋友也对这块不是很清楚, 所以我觉得有必要专门写一下.
一些基本的概念, 我就不赘述了, 因为看代码很容易能看懂, 我这里就主要介绍几个看代码没那么容易看懂的点, 为什么这么说呢, 呵呵, 我在写文章之前, 查找了下已有的资料, 已避免重复功, 其中看到了TIPI项目对这部分的描述, 发现其中错误很多. 所以, 我想这部分就是看代码也没那么容易看懂的点 🙂
一个同事forward过来一个, 公司某产品线遇到的一个低概率, 但长时间出现了几次的Core的bt信息, 找我帮忙分析下原因.
bt栈如下(路径信息以*代替):
#0 0x00000000004a75e5 in _zend_mm_alloc_int (heap=0xd61260, size=79) at /*/php-5.2.6/Zend/zend_alloc.c:1879 #1 0x000000000048d3cd in vspprintf (pbuf=0x7fbffe9cd8, max_len=1024, format=Variable "format" is not available. ) at /*/php-5.2.6/main/spprintf.c:224 #2 0x0000000000489747 in php_error_cb (type=1, error_filename=0x2a9a787ee8 "/*/application/helpers/util.php", error_lineno=1149, format=Variable "format" is not available. ) at /*/php-5.2.6/main/main.c:799 #3 0x000000000061db35 in soap_error_handler (error_num=1, error_filename=0x2a9a787ee8 "/*/application/helpers/util.php", error_lineno=1149, format=0x7b9cb8 "Maximum execution time of %d second%s exceeded", args=0x7fbffea3b0) at /*/php-5.2.6/ext/soap/soap.c:2178 #4 0x00000000004c2576 in zend_error (type=1, format=0x7b9cb8 "Maximum execution time of %d second%s exceeded") at /*/php-5.2.6/Zend/zend.c:976 #5 <signal handler called> #6 0x00000000004a720f in _zend_mm_free_int (heap=0xd61260, p=Variable "p" is not available. ) at /*/php-5.2.6/Zend/zend_alloc.c:844 ...以下省略with 12 Comments