内存一直都是神秘的内容,那我们PHP在处理的时候是怎样来分配我们的内存?
PHP不需要显式的对内存进行管理,这些工作都由PHP解释器进行了。由此PHP内部有一个内存管理体系, 它会自动将不再使用的内存垃圾进行释放,php的默认内存大小是32M,在php.ini中memory_limit = 32M
- memory_get_usage(),这个函数的作用是获取 目前PHP脚本所用的内存大小。
- memory_get_peak_usage(),这个函数的作用返回 当前脚本到目前位置所占用的内存峰值,这样就可能获取到目前的脚本的内存需求情况。
从开始就有一套属于自己的内存管理机制,在5.3之前使用的是经典的引用计数技术,但引用技术存在一定的技术缺陷,在PHP5.3之后,引入了新的垃圾回收机制,至此,PHP的内存管理机制更加完善。
一次性读取超大的文件到内存中,或者出现超大的数组,或者在大循环中的没有及时是放掉不再使用的变量, 这些都有可能会造成内存占用过大而被终止
Fatal error:Allowed memory size of X bytes exhausted (tried to allocate Y bytes)
内存管理一般会包括以下内容:
- 是否有足够的内存供我们的程序使用;
- 如何从足够可用的内存中获取部分内存;
- 对于使用后的内存,是否可以将其销毁并将其重新分配给其它程序使用。
PHP底层对内存的管理, 围绕着小块内存列表(free_buckets)、 大块内存列表(large_free_buckets)和剩余内存列表(rest_buckets)三个列表来分层进行的。 ZendMM向系统进行的内存申请,并不是有需要时向系统即时申请,而是由ZendMM的最底层(heap层)先向系统申请一大块的内存,通过对上面三种列表的填充,建立一个类似于内存池的管理机制。 在程序运行需要使用内存的时候,ZendMM会在内存池中分配相应的内存供使用。这样做的好处是避免了PHP向系统频繁的内存申请操作
PHP对内存的分配,是结合PHP的用途来设计的,PHP一般用于web应用程序的数据支持,单个脚本的运行周期一般比较短(最多达到秒级),内存大块整块的申请,自主进行小块的分配, 没有进行比较复杂的不相临地址的空闲内存合并,而是集中再次向系统请求。 这样做的好处就是运行速度会更快,缺点是随着程序的运行时间的变长,内存的使用情况会“越来越多”(PHP5.2及更早版本)。 所以PHP5.3之前的版本并不适合做为守护进程长期运行。
销毁
ZendMM在内存销毁的处理上采用与内存申请相同的策略,当程序unset一个变量或者是其他的释放行为时, ZendMM并不会直接立刻将内存交回给系统,而是只在自身维护的内存池中将其重新标识为可用,按照内存的大小整理到上面所说的三种列表(small,large,free)之中,以备下次内存申请时使用。
后期将带来php代码怎么样分配不同变量类型的内存