当前位置: 首页 > 后端技术 > PHP

对PHP垃圾回收机制的一些粗浅认识

时间:2023-03-29 19:58:14 PHP

相信刚开始学过一点开发的同学都知道,无论什么编程语言,都会在内存中存入一个变量。事实上,我们开发人员不断地来回操作内存。相应地,如果我们不断地增加新的变量,内存也会不断增加。如果没有很好的机制,那么内存会无限制的增加,最终会被填满。所有的记忆。这会造成内存泄漏。但是在日常开发中,除非一次加载一个大文件,否则我们几乎看不到内存溢出错误,这就是垃圾回收机制的作用。什么是垃圾收集?在使用C语言的时候,我们不得不手动使用free来释放内存。大多数C之后的编程语言都会有垃圾回收这样的处理能力,也就是我们今天要说的垃圾回收机制,也被称为forGC。在具有GC能力的开发语言中,我们不需要关心什么时候释放内存,甚至根本不需要了解这块的内容,因为这些语言已经帮我们处理了内存释放问题在底部。当然,这方面最著名的内容还是Java中的垃圾回收机制。其实PHP也有相应的处理机制。当然,可能很多PHPer都没接触过。今天我们就来谈谈这个方面。PHP的垃圾回收算法在之前的文章中,我们介绍过引用计数[]()的概念。在PHP5.3之前,PHP的垃圾回收机制很简单,就是清理回收所有0的refcounts,底层是空闲的。但是这种方式会带来一个问题,就是我们在引用计数一文中提到的循环引用。这种引用问题是无法通过普通的判断refcount的方式来回收的。所以在PHP5.3之前,循环引用会造成内存泄漏。之所以强调版本是因为PHP在5.3之后改进了垃圾回收算法,解决了这个循环引用。(当然,我们在日常开发中尽量避免这种循环引用问题)。具体算法我们参考官方图片:官方文档中有详细的解释,但是还是很迷惑。我们将用简单的语言(说人类的语言)来描述这个过程。首先,我们有了根缓冲区的概念,也就是图中的根。在底层,我们可以通过一系列难以理解的算法找到每个变量的可能根。PHP会将变量的可能根放入根缓冲区。当rootbuffer满时,默认值一般为10000,需要修改源码重新编译修改该值。PHP会启动垃圾回收机制,根据深度遍历的算法从rootbuffer中找到所有与这个可能root相关的变量,并将某个可能root找到的变量的refcount减1,并将当前标记为“减去””。然后再次深度遍历,refcount不为0则加1,为0则保持不变。然后清除根缓冲区中所有可能的根,清除而不是删除。然后清理并释放所有引用计数为0的变量内容。你是不是已经感到困惑了?其实我也很迷茫,不知道这一段怎么写。。。记住几个要点应对面试,秒杀大部分人。PHP5.3以后不再直接检查每个变量的refcount是否为0,使用的算法是深度遍历。有一个根缓冲区,用于清理。具体算法需要扎实的C和算法基础。学习源码的时候我们仔细研究一下。5.3之后的算法解决了循环引用的问题。内存泄漏值会保持在一定范围内,不会立即出现大规模的崩溃。垃圾回收对性能的影响如前所述,垃圾回收发生在根缓冲区已满时。它将立即执行。还会有两次深度遍历,必然带来性能消耗。毕竟,算法的执行是耗时的。不过,与内存溢出这种毁灭性的错误相比,垃圾回收带来的性能损失基本可以忽略不计。总结一下垃圾回收的内容,我们只需要记住几个重点即可。具体的核心算法和内容只有深入研究源码才能完全理解。当然,这也是我们的学习目标。源码底部的相关内容我一定会涉猎,让我们拭目以待!参考文档:https://www.php.net/manual/zh/features.gc.collecting-cycles.phphttps://www.php.net/manual/zh/features.gc.performance-considerations.phphttps:///www.cnblogs.com/lishanlei/p/9852274.htmlhttps://www.cnblogs.com/lovehappying/p/3679356.html各媒体平台均可搜索【硬核项目经理】