- PHP中的
GC
在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾;
PHP会将其在内存中销毁。这是PHP的GC
垃圾回收机制,目的是防止内存溢出;
php 中变量在内存中是存在于一个
zval
的变量容器中。结构如下:
可以使用
xdebug
来进行调试
PHP垃圾回收机制是
php5
之后才有的这个东西,php5.3
之前使用的垃圾回收机制是单纯的“引用计数”,就是每个内存对象都分配一个计数器,当内存对象被变量引用时,计数器+ 1
;当变量引用撇掉后,计数器-1
;当计数器=0
时,表名内存中对象没有被使用,该内存对象进行销毁,垃圾回收完成;
php5.3开始,使用了新的垃圾回收机制,在引用计数基础上,实现了一种复杂的算法,来检测内存对象中
引用环
的存在,以避免内存泄露;
PHP5和PHP7的垃圾回收机制有什么不同
PHP5和PHP7的垃圾回收机制都属于引用计数,但是在复杂数据类型的算法处理上:
在 PHP7 中 zval 有了新的实现方式。
最基础的变化就是 *zval 需要的内存不再是单独从堆上分配,不再自己存储引用计数。
复杂数据类型(比如字符串、数组和对象)的引用计数由其自身来存储
这种实现方式有以下好处:
- 简单数据类型不需要单独分配内存,也不需要计数;
- 不会再有两次计数的情况。在对象中,只有对象自身存储的计数是有效的;
- 由于现在计数由数值自身存储,所以也就可以和非 zval 结构的数据共享,比如 zval 和 hashtable key 之间;