前言:
PHP在运行时所需的内存,是一次性向操作系统申请开辟的,而不是分多次。那他是怎么样一次性申请呢,机制又是如何?请看下边介绍。
heap层是PHP内存管理的核心实现,PHP底层对内存的管理本文来源[email protected]搞@^&代*@码)网9搞代gaodaima码, ZendMM向系统进行的内存申请,并不是有需要时向系统即时申请, 而是由ZendMM的最底层(heap层)先向系统申请一大块的内存, 建立一个类似于内存池的管理机制,unset后,ZendMM并不会直接立刻将内存交回给系统,而是只在自身维护的内存池(storge层)中将其重新标识为可用,。
优点:
1.预定义常量变量多,对内存的请求有数百次,避免了PHP向系统频繁的内存申请操作,减少了对OS的请求次数。
2.运行速度会更快,缺点是随着程序的运行时间的变长,内存使用越来越多,所以5.3引入新垃圾回收机制。
详细分析如下:
PHP的内存管理可以被看作是分层(hierarchical)的。 它分为三层:存储层(storage)、堆层(heap)和接口层(emalloc/efree)。 存储层通过 malloc()、mmap() 等函数向系统真正的申请内存,并通过 free() 函数释放所申请的内存。
存储层通常申请的内存块都比较大,这里申请的内存大并不是指storage层结构所需要的内存大, 只是堆层通过调用存储层的分配方法时,其以大块大块的方式申请的内存,存储层的作用是将内存分配的方式对堆层透明化。
如图下所示,PHP内存管理器。PHP在存储层共有4种内存分配方案: malloc,win32,mmap_anon,mmap_zero, 默认使用malloc分配内存,如果设置了ZEND_WIN32宏,则为windows版本,调用HeapAlloc分配内存, 剩下两种内存方案为匿名内存映射,并且PHP的内存方案可以通过设置环境变量来修改。