PHP的垃圾回收机制-PHP高级面试题+详解
副标题[/!--empirenews.page--]
面试10家公司,收获9个offer,2020年PHP 面试问题? ps:本篇内容包括精选面试题与知识篇。 PHP面试题关于PHP的垃圾回收机制,PHP的垃圾回收机制引用计数 (reference counting) GC 机制,PHP可以自动进行内存管理,清除不需要的对象,PHP面试题分享PHP关于垃圾回收机制的面试题: 我的PHP学习交流社区? 面试题篇
PHP使用了引用计数(reference counting)GC机制,同时使用根缓冲区机制,当php发现有存在循环引用的zval时,就会把其投入到根缓冲区,当根缓冲区达到配置文件中的指定数量后,就会进行垃圾回收,以此解决循环引用导致的内存泄漏问题。
每个对象都内含一个引用计数器refcount,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为 NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。 ?
A、开启/关闭垃圾回收机制可以通过修改php配置实现 B、可以在程序中使用gc_enable() 和 gc_disable()开启和关闭。 C、PHP中的垃圾回收机制,会大幅度提升系统性能。 D、开启垃圾回收机制后,针对内存泄露的情况,可以节省大量的内存空间,但是由于垃圾回收算法运行耗费时间,开启垃圾回收算法会增加脚本的执行时间。 参考答案:C ?
A、在一个垃圾周期中,通过检查引用计数是否减1,并且检查哪些变量容器的引用次数是零,来发现哪部分是垃圾 B、可以通过调用gc_enable() 和 gc_disable()函数来打开和关闭垃圾回收机制 C、通过清理未被使用的变量来节省内存的占用 D、php代码执行完毕后会自动执行垃圾回收,所以不需要手动执行垃圾回收 参考答案:D 知识篇一、概念 垃圾回收是一个多数编程语言中都带有的内存管理机制。与非托管性语言相反:C,C++ 和 Objective C,用户需要手动收集内存,带有 GC 机制的语言:Java,javaScript 和 PHP 可以自动管理内存。 垃圾回收机制(gc)顾名思义,就是废物重利用的意思,是一种动态存储分配的方案。它会自动释放程序不再需要的已分配的内存块。垃圾回收机制可以让程序员不必过分关心程序内存分配,从而将更多的精力投入到业务逻辑。 在现在的流行各种语言当中,垃圾回收机制是新一代语言所共有的特征,如Python、PHP、C#、Ruby等都使用了垃圾回收机制。 二、PHP垃圾回收机制 1、在PHP5.3版本之前,使用的垃圾回收机制是单纯的“引用计数”。 什么叫做引用计数? 即: ① 每个内存对象都分配一个计数器,当内存对象被变量引用时,计数器+1; ② 当变量引用撤掉后(执行unset()后),计数器-1; ③ 当计数器=0时,表明内存对象没有被使用,该内存对象则进行销毁,垃圾回收完成。 ? 并且PHP在一个生命周期结束后就会释放此进程/线程所占的内容,这种方式决定了PHP在前期不需要过多考虑内存的泄露问题。 但是当两个或多个对象互相引用形成环状后,内存对象的计数器则不会消减为0;这时候,这一组内存对象已经没用了,但是不能回收,从而导致内存泄露的现象。 php5.3开始,使用了新的垃圾回收机制,在引用计数基础上,实现了一种复杂的算法,来检测内存对象中引用环的存在,以避免内存泄露。 ?
如官方文档所说:每个php变量存在一个叫"zval"的变量容器中。一个zval变量容器,除了包含变量的类型和值,还包括两个字节的额外信息。第一个是"is_ref",是个bool值,用来标识这个变量是否是属于引用集合(reference set)。通过这个字节,php引擎才能把普通变量和引用变量区分开来,由于php允许用户通过使用&来使用自定义引用,zval变量容器中还有一个内部引用计数机制,来优化内存使用。 第二个额外字节是"refcount",用以表示指向这个zval变量容器的变量(也称符号即symbol)个数。所有的符号存在一个符号表中,其中每个符号都有作用域(scope)。 官方文档所说,可以使用Xdebug来检查引用计数情况:
? 以上例程会输出:
注意:从PHP7的NTS版本开始,以上例程的引用将不再被计数,即$c=$b=$a之后a的引用计数也是1.具体分类如下: 在PHP 7中,zval可以被引用计数或不被引用。在zval结构中有一个标志确定了这一点。 ① 对于null,bool,int和double的类型变量,refcount永远不会计数; ② 对于对象、资源类型,refcount计数和php5的一致; (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |