2017/06/14 PHP/Python/Java No Comments PHP垃圾回收与内存管理基本原理 ##### 内存管理机制了解: >var_dump(memory_get_usage());//获取内存方法,加上true返回实际内存,不加则返回表现内存 $a = "https://www.fity.cn"; var_dump(memory_get_usage()); unset($a); var_dump(memory_get_usage()); 输出: int 368752 int 368920 int 368752 可以直观的看出定义变量之后,内存增加,清除变量之后,内存恢复(有些可能不会恢复和以前一样),好像定义变量时申请了一次内存,其实不是这样的,php会预先申请一块内存,不会每次定义变量就申请内存。PHP不像C语言那样,只有你显示的调用内存分配相关API才会有内存的分配。也就是说, 在PHP中,有很多我们看不到的内存分配过程。隐式的内存分配点就有: 1.为变量名分配内存,存入符号表 2.为变量值分配内存 所以, 不能只看表象。别怀疑,PHP的unset确实会释放内存,但这个释放不是C编程意义上的释放,不是交回给OS。当我们调用内存分配相关API申请内存的时候,PHP并不是简单的向OS要内存,而是会像OS要一个大块的内存,然后把其中的一块分配给申请者,这样当再有逻辑来申请内存的时候,就不再需要向OS申请内存了, 避免了频繁的系统调用。详细推荐参考《[深入理解PHP内存管理之谁动了我的内存](http://www.laruence.com/2011/03/04/1894.html "深入理解PHP内存管理之谁动了我的内存")》 ##### 垃圾回收机制(Garbage Collector 简称GC): ------------ 在php中,没有任何变量指向这个对象时,这个对象就成为垃圾。PHP会将其在内存中销毁;这是PHP的GC垃圾处理机制,防止内存溢出。当一个PHP线程结束时,当前占用的所有内存空间都会被销毁,当前程序中所有对象同时被销毁。GC进程一般都跟着每起一个SESSION而开始运行的.gc目的是为了在session文件过期以后自动销毁删除这些文件。 简单的说,PHP可以自动进行内存管理,清除不再需要的对象。PHP使用了引用计数这种单纯的垃圾回收机制。每个对象都内含一个引用计数器,每个reference链接到对象,计数器加1,当reference离开生存空间或者被设为null,计数器减1,当某个引用计数器的对象为0时,PHP知道你将不再需要使用这个对象(简单的说就是当引用数等于0时,就会被销毁),释放其所占有的内存空间。 ##### 回收周期: 对算法的完全说明有点超出这部分内容的范围,将只介绍其中基础部分。首先,我们先要建立一些基本规则,如果一个引用计数增加,它将继续被使用,当然就不再在垃圾中。如果引用计数减少到零,所在变量容器将被清除(free)。就是说,仅仅在引用计数减少到非零值时,才会产生垃圾周期(garbage cycle)。其次,在一个垃圾周期中,通过检查引用计数是否减1,并且检查哪些变量容器的引用次数是零,来发现哪部分是垃圾。详细参考《[回收周期(Collecting Cycles)](http://php.net/manual/zh/features.gc.collecting-cycles.php "回收周期(Collecting Cycles)")》 ##### 性能方面考虑的因素总结: 通常,PHP中的垃圾回收机制,仅仅在循环回收算法确实运行时会有时间消耗上的增加。但是在平常的(更小的)脚本中应根本就没有性能影响。 然而,在平常脚本中有循环回收机制运行的情况下,内存的节省将允许更多这种脚本同时运行在你的服务器上。因为总共使用的内存没达到上限。 ##### 相关配置: php.ini配置:zend.enable_gc,默认值为on,如果想关闭垃圾回收机制,可以设置为off 函数: > gc_enable–激活循环引用收集器 gc_disable–停用循环引用收集器 gc_collect_cycles–强制收集所有现存的垃圾循环周期(即使在可能根缓冲区还没满时,也能强制执行周期回收。你能调用gc_collect_cycles()函数达到这个目的。这个函数将返回使用这个算法回收的周期数。比如再你打算关闭垃圾回收机制之前,先调用一下这个函数,绝对是个明智的选择) ###### 主要参考:[PHP.垃圾回收机制](http://php.net/manual/zh/features.gc.php "PHP.垃圾回收机制") 本文最后更新于 2019-06-27 13:50:43 并被添加「php PHP内存管理 PHP垃圾回收」标签,已有 4014 位童鞋阅读过。 本文作者:未来往事 本文链接:https://felixway.cn/post/632.html 本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处 相关文章 PHP一个数组按另一个数组顺序排序 百度主动推送API程序代码(PHP版) php imagecreatefromjpeg return bool(false) php生成多级目录函数 php分卷备份恢复mysql数据库
此处评论已关闭