PHP内存模型
|
|
PHP Memory Management
php内存管理分为3层
当然你也可以通过setenv(“USE_ZEND_ALLOC”) = 0直接使用系统调用
|
|
从alloc_globals_ctor可以看到,当关闭USE_ZEND_ALLOC之后,php会通过malloc来管理head的内存分配,而不是mmap的方式。同时,使用malloc分配内存的方式也称为持久的内存分配方式,php代码中也涉及相关的内容
持久内存分配
|
|
我们可以拿几个来看看
持久化内存
|
|
可以看到, 无论是_safe_malloc,还是zend_calloc,持久化方式最终调用的都是zend_malloc,而zend_malloc内部调用的malloc来进行内存的分配,其中zend_calloc和_safe_malloc的区别仅仅在于是否初始化内存空间为0
非持久化内存
|
|
这里可以看到,非持久化方式,使用zend_mm_alloc_heap,来分配heap的空间,其中根据size的不同有3中分配方式
也就是
(0, ZEND_MM_MAX_SMALL_SIZE]
(ZEND_MM_MAX_SMALL_SIZE, ZEND_MM_MAX_LARGE_SIZE]
(ZEND_MM_MAX_LARGE_SIZE, ZEND_MM_PAGE_SIZE]
这里还需要注意的是storage层,并不是指zend_mm_storage对象,需要区分开,从源码看zend_mm_storage只会跟PHPDBG有关,PHPDBG是什么呢?
PHPDBG
PHPDBG是一个PHP的SAPI模块,可以在不用修改代码和不影响性能的情况下控制PHP的运行环境。PHPDBG的目标是成为一个轻量级、强大、易用的PHP调试平台。可以在PHP5.4和之上版本中使用。在php5.6和之上版本将内部集成。
主要功能:
- 单步调试
- 灵活的下断点方式(类方法、函数、文件:行、内存地址、opcode)
- 可直接调用php的eval
- 可以查看当前执行的代码
- 用户空间API(userland/user space)
- 方便集成
- 支持指定php配置文件
- JIT全局变量
- readline支持(可选),终端操作更方便
- 远程debug,使用java GUI
- 操作简便(具体看help)
|
|
很像gdb是不?转回正题