PHP垃圾回收机制

2018-06-30  本文已影响31人  Monkey_zhou

在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾;
PHP会将其在内存中销毁。这是PHP的 GC 垃圾回收机制,目的是防止内存溢出;

php 中变量在内存中是存在于一个 zval 的变量容器中。结构如下:

zval变量容器

可以使用 xdebug 来进行调试

PHP垃圾回收机制是 php5 之后才有的这个东西,php5.3 之前使用的垃圾回收机制是单纯的“引用计数”,就是每个内存对象都分配一个计数器,当内存对象被变量引用时,计数器+ 1;当变量引用撇掉后,计数器 -1 ;当计数器 =0 时,表名内存中对象没有被使用,该内存对象进行销毁,垃圾回收完成;

php5.3开始,使用了新的垃圾回收机制,在引用计数基础上,实现了一种复杂的算法,来检测内存对象中 引用环 的存在,以避免内存泄露;

PHP5和PHP7的垃圾回收机制有什么不同

PHP5和PHP7的垃圾回收机制都属于引用计数,但是在复杂数据类型的算法处理上:
在 PHP7 中 zval 有了新的实现方式。
最基础的变化就是 *zval 需要的内存不再是单独从堆上分配,不再自己存储引用计数。
复杂数据类型(比如字符串、数组和对象)的引用计数由其自身来存储

这种实现方式有以下好处:

  1. 简单数据类型不需要单独分配内存,也不需要计数;
  2. 不会再有两次计数的情况。在对象中,只有对象自身存储的计数是有效的;
  3. 由于现在计数由数值自身存储,所以也就可以和非 zval 结构的数据共享,比如 zval 和 hashtable key 之间;
上一篇 下一篇

猜你喜欢

热点阅读