首页 > 编程语言 >PHP垃圾回收机制理解

PHP垃圾回收机制理解

时间:2023-02-02 14:05:34浏览次数:69  
标签:null 内存 回收 计数 引用 PHP unset 垃圾

使用的是“引用计数”方式进行回收。简单地理解的话,就是每个分配的内存区域都有一个计数器,记录有多少个变量指针指向这片内存。当指向该片内存的指针数量为0,那么该片内存区域就可以被回收。
 
引用计数计数简单,强大,但是有一个致命的缺陷,就是环状引用。考虑以下的代码:
 
Php代码 
$a = array(); 
$a[] = &$a; 
unset($a); 

PHP垃圾回收机制理解_引用计数

​​变量$a引用了自己,形成了一个环。$a被unset了,可是由于存在环状引用,因此$a之前指向的内存的引用计数为1,因此该内存区域不会被垃圾回收机制回收。
 
 
PHP5.3针对这个重大的缺陷做了优化。虽然其基础仍然是引用计数,但是在做了一些改良,能够将环状引用导致的内存泄露控制在一定的规模以内。当然,这并不是说你可以随便滥用内存,编写代码时仍然要小心为上!
 
 
其他要点:
1.PHP脚本运行完毕,该脚本申请的所有内存空间都会释放,不管是否存在环状引用。因此环状引用内存泄露的问题一般只影响长时间运行的程序脚本。
 
2.垃圾回收机制需要满足一定的条件才会执行。因此unset后,系统并不一定会立即回收垃圾。
 
3.unset的作用。
“unset只是断开一个变量到一块内存区域的连接,同时将该内存区域的引用计数-1”。也就是说,如果有一个以上的变量指向同一个内存区域,或者存在环状引用,那么unset不会使内存区域释放。断开也说明unset并不会直接删除内存区域,而只是改变其引用计数而已。
 
4.$xx=null的作用。
“$a = null 是直接将$a 指向的数据结构置空,同时将其引用计数归0”。根据我对这个定义的理解,=null操作可以立即释放掉内存空间!因此很多PHP技巧中不厌其烦地对我们说,先将变量设为null,再unset。理解其深层原理后,我才彻底理解了这样做的原因!=null才是王道!



标签:null,内存,回收,计数,引用,PHP,unset,垃圾
From: https://blog.51cto.com/u_2820398/6033524

相关文章

  • php多态
    多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息将可以产生不同的结果,这种现象称为多态性。多态性允许每个对象以适合......
  • PHP读取excel(5)
    如果数据量很大的时候,就需要用PHPExcel迭代器逐行读取,具体代码如下:<?phpheader("Content-Type:text/html;charset=utf-8");//引入读取excel类文件require"./PHPExcel/PHPEx......
  • PHP生成excel(1)
    先到PHPExcel官网下载PHPExcel类把excel类包含进来,然后直接使用<?phprequire"./PHPExcel/PHPExcel.php";//实例化excel类$objPHPExcel=newPHPExcel();//获得当前活动she......
  • PHPMyWind支持Word粘贴
    ​ 图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码目前限chrome浏览器使用首先以um-editor的二进制流保存为例:打开umeditor.j......
  • 废旧铅蓄电池实现铅的回收流程
     废旧铅蓄电池的铅膏中主要含有PbSO4、PbO2、PbO和Pb。还有少量Ba、Fe、Al的盐或氧化物等。为了保护环境、充分利用铅资源,通过下图流程实现铅的回收。  一些难溶......
  • Unity性能优化(三) 垃圾回收,Garbage Collection,GC
    Unity的内存管理Unity由两部分内存来组成,原生内存(NativeMemory)和托管内存(ManagedMemory)。其中NativeMemory是引擎管理的内存,大家接触的会比较少,而且可操控性也比较......
  • PHP中的include和require
    在PHP中,有两种包含外部文件的方式,分别是include和require。他们之间有什么不同呢?如果文件不存在或发生了错误,require产生E_COMPILE_ERROR级别的错误,程序停止运行。而inclu......
  • go GMP与垃圾回收
    ......
  • PHP 前端大文件上传
    ​ 核心原理: 该项目核心就是文件分块上传。前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题。* 如何分片;* 如何合成......
  • php三元运算 ?:与??区别
    三元运算在流程中进程用到,你有犯晕的时候吗?$a?:default与$a??default共同点都是判断$a是否存在,存在返回:$a,否则返回:default$a='';$b=0;$c='0';$d=array();$e=null......