PHP5.2 与 PHP5.3 垃圾回收算法之间的比较

PHP的底层代码是由C/C++语言来编写的,PHP的内存管理器的架构如下:

PHP5.2 与 PHP5.3 垃圾回收算法之间的比较_第1张图片

存储层(storage)

这一层是内存申请,ZendMM向系统进行的内存申请,并不是有需要时向系统即时申请,而是由Z恩典MM的最底层(heap层)先向系统申请一大块的内存,通过对上面三种列表的填充,建立一个类似于内存池的管理机制。在程序再需要使用内存的时候,ZendMM会在内存池中分配相应的内存供使用。这样做的好处是避免了PHP向系统频繁的内存操作。

堆层(heap)

这一层是初始化内存,PHP内存管理主要维护三个列表:

1)、小块内存列表free_buckets

2)、大块内存列表large_free_buckets

3)、剩余内存列表rest_buckets

接口层

就是一些宏定义,主要是我们自己编写的一些应用程序

 

内存的销毁

ZendMM在内存销毁的处理上采用与内存申请相同的策略,当程序unset一个变量或者是其他的释放行为时,ZendMM并不会直接立刻将内存交回给系统,而是只在自身维护的内存池中将其重新标识为可用,按照内存的大小整理到上面所说的三种列表(small、large、free)之中,已被下次内存申请时使用。

程序使用的所有内存,将在进程结束时统一交还给系统。

=================================================================

垃圾回收

自动回收内存的过程叫垃圾收集。PHP提供了语言层的垃圾回收机制,让程序员不必过分关心程序内存分配。

PHP5.3之前

引用计数方式的内存动态管理

PHP中所有的变量都是zval变量的形式存在。

变量引用计数变为0时,PHP将在内存中销毁这个变量,并且PHP在一个生命周期结束后就会释放此进程/线程所占的内容

PHP5.3之后的垃圾回收

垃圾收集机制基于PHP的动态内存管理而存在。PHP5.3之后为引入垃圾收集机制,在变量存储的基本结构上有一些变动

PHP5.2 与 PHP5.3 垃圾回收算法之间的比较_第2张图片

它使用的是一种同步回收的算法。

PHP5.2 与 PHP5.3 垃圾回收算法之间的比较_第3张图片

在PHP官方文档中我们可以清楚了解到两种算法之间性能的比较:

http://docs.php.net/manual/zh/features.gc.performance-considerations.php

===================================================================

 

你可能感兴趣的:(内存管理,PHP垃圾回收机制)