PHP对象递归引用造成内存泄漏分析
2023-06-13 09:15:44 时间
通常来说,如果PHP对象存在递归引用,就会出现内存泄漏。这个Bug在PHP里已经存在很久很久了,先让我们来重现这个Bug,示例代码如下:
<?php classFoo{ function__construct(){ $this->bar=newBar($this); } } classBar{ function__construct($foo){ $this->foo=$foo; } } for($i=0;$i<100;$i++){ $obj=newFoo(); unset($obj); echomemory_get_usage(),"/n"; } ?>
运行以上代码,你会发现,内存使用量本应该不变才对,可实际上却是不断增加,unset没有完全生效。
现在的开发很多都是基于框架进行的,应用里存在复杂的对象关系,那么就很可能会遇到这样的问题,下面看看有什么权宜之计:
<?php classFoo{ function__construct(){ $this->bar=newBar($this); } function__destruct(){ unset($this->bar); } } classBar{ function__construct($foo){ $this->foo=$foo; } } for($i=0;$i<100;$i++){ $obj=newFoo(); $obj->__destruct(); unset($obj); echomemory_get_usage(),"/n"; } ?>
办法有些丑陋,不过总算是对付过去了。幸运的是这个Bug在PHP5.3的CVS代码中已经被修复了。
对此,在进行PHP程序设计时有必要加以注意!相信本文所述对大家的PHP程序设计有一定的参考价值。
相关文章
- 深入理解JVM内存分配策略
- Linux下驱动开发_块设备驱动开发(内存模拟存储)
- PHP对接chatGPT代码,openai接口对接,php 实现chatGPT功能
- OS——内存扩充技术
- 【嵌入式开发】ARM 内存操作 ( DRAM SRAM 类型 简介 | Logical Bank | 内存地址空间介绍 | 内存芯片连接方式 | 内存初始化 | 汇编代码示例 )
- Centos环境自写脚本查看使用php或nginx占用内存详解程序员
- 数据库PHP究竟如何还原MySQL数据库?(php还原mysql)
- Linux内存拷贝:memcpy函数的应用(linuxmemcpy)
- Linux: 了解不同类型的内存(linux内存类型)
- 释放你的内存:Redis虚拟内存解决方案(redis虚拟内存)
- 监控Redis运行状态:妙用PHP(php监听redis)
- 实用脚本:检查高 CPU / 内存消耗进程
- PHP如何准确获取MySQL数据库中的错误信息?(php获取mysql错误)
- PHP编程:如何获取和处理MySQL错误信息(php获取mysql错误)
- PHP如何连接MSSQL数据库?(php连接mssql)
- Redis内存优化:提升性能,降低成本(redismemory)
- Linux内存读写探究:如何优化数据处理效率?(linux内存读写)
- 用PHP从MSSQL读取数据表列表(php查询mssql列表)
- 使用PHP和MySQL研究论文(php mysql 论文)
- 安装MongoDB,接入PHP开发新篇章(php安装mongodb)
- 深入了解Oracle内存中的读写情况(oracle内存读写情况)
- 如何节省Redis内存(节省redis内存配置)
- 探究Redis与内存表之间的差异(内存表和redis差距)
- 善用内存型Redis,提升运算效率(内存型redis)
- Redis最大容量优化把握Live场景(redis调整最大内存)
- PHP和Mysqlweb应用开发核心技术第1部分Php基础-1开始了解php
- php数据结构算法(PHP描述)简单选择排序simpleselectionsort
- PHP基于php_imagick_st-Q8.dll实现JPG合成GIF图片的方法