PHP对象递归引用造成内存泄漏分析

通常来说,如果PHP对象存在递归引用,就会出现内存泄漏。这个Bug在PHP里已经存在很久很久了,先让我们来重现这个Bug,示例代码如下:

class Foo {

function __construct() {

$this->bar = new Bar($this);

}

}

class Bar {

function __construct($foo) {

$this->foo = $foo;

}

}

for ($i = 0; $i < 100; $i++) {

$obj = new Foo();

unset($obj);

echo memory_get_usage(), "/n";

}

?>

运行以上代码,你会发现,内存使用量本应该不变才对,可实际上却是不断增加,unset没有完全生效。

现在的开发很多都是基于框架进行的,应用里存在复杂的对象关系,那么就很可能会遇到这样的问题,下面看看有什么权宜之计:

class Foo {

function __construct() {

$this->bar = new Bar($this);

}

function __destruct() {

unset($this->bar);

}

}

class Bar {

function __construct($foo) {

$this->foo = $foo;

}

}

for ($i = 0; $i < 100; $i++) {

$obj = new Foo();

$obj->__destruct();

unset($obj);

echo memory_get_usage(), "/n";

}

?>

办法有些丑陋,不过总算是对付过去了。幸运的是这个Bug在PHP5.3的CVS代码中已经被修复了。

对此,在进行PHP程序设计时有必要加以注意!相信本文所述对大家的PHP程序设计有一定的参考价值。相关阅读:

C#实现简单的汽车租赁系统

Mysql日志文件和日志类型介绍

js简单判断flash是否加载完成的方法

C#异常处理中try和catch语句及finally语句的用法示例

mysql存储过程 游标 循环使用介绍

php实现读取和写入tab分割的文件

ASP.NET中为TextBox中添加calendar.js示例代码

C#如何解析http报文

测试php函数的方法

经过绑定元素时会多次触发mouseover和mouseout事件

js实现简单选项卡与自动切换效果的方法

Windows8系统个性化锁屏界面设置方法图文教程

mysql_connect localhost和127.0.0.1的区别(网络层阐述)

nodejs命令行参数处理模块commander使用实例

php 在对象中递归 坑,PHP_PHP对象递归引用造成内存泄漏分析,通常来说,如果PHP对象存在递 - phpStudy...相关推荐

  1. sqlserver2008未将对象引用设置到对象的实例_面试官:ThreadLocal 的内存泄漏是弱引用导致的,你确定?...

    面试官:ThreadLocal 了解吗? Python 小星:线程局部变量,多线程下能保证各个线程的变量相对独立于其他线程的变量. 面试官:那你说下它是如何保证线程隔离的? Python 小星:每个线 ...

  2. Java中关于内存泄漏分析和解决方案,都在这里了!

    作者:李序锴 www.jianshu.com/p/54b5da7c6816 最近正在熟悉Java内存泄漏的相关知识,上网查阅了一些资料,在此做个整理算是对收获的一些总结,希望能对各位有所帮助,有问题可 ...

  3. python opencv 内存泄露_解决python中显示图片的plt.imshow plt.show()内存泄漏问题

    当要处理批量图片,且每张图片都要进行显示时,用plt.imshow() plt.show()会出现内存泄漏, 管理器中看到其中一个python进程的内存不断上涨,目前有找到解决方法 from matp ...

  4. python plt.show_解决python中显示图片的plt.imshow plt.show()内存泄漏问题

    当要处理批量图片,且每张图片都要进行显示时,用plt.imshow() plt.show()会出现内存泄漏, 管理器中看到其中一个python进程的内存不断上涨,目前有找到解决方法 from matp ...

  5. VC++ 6.0 中如何使用 CRT 调试功能来检测内存泄漏[转]

    /C++ 编程语言的最强大功能之一便是其动态分配和释放内存,但是中国有句古话:"最大的长处也可能成为最大的弱点",那么 C/C++ 应用程序正好印证了这句话.在 C/C++ 应用程 ...

  6. 解析面试常问题之JavaScript中的闭包概念及应用,顺便普及一下大家口中常说的内存泄漏问题

    JavaScript中的闭包是一个面试中经常被考到的问题,大家可能都对这个概念多多少少都有一些模糊的概念或者一点都不了解,那么今天就来给大家讲解一下. 公众号:前端印象 不定时有送书活动,记得关注~ ...

  7. [转载] java给对象中的包装类设置默认值

    参考链接: Java中的对象类Object 处理方法如下 主要适用于,对象中使用了包装类,但是不能给null需要有默认值的情况 /** * 处理对象中包装类,因为快捷签没有用包装类 * * @para ...

  8. 对象、对象的属性、对象字面量、枚举对象中的属性、可变类型、变量和对象——JS对象

    目录 一.对象 二.对象的属性 三.对象字面量 四.枚举对象中的属性 五.可变类型 六.变量和对象 数据类型: 原始值:(不可变类型) 1.数值 Number 2.大整数 BigInt 3.字符串 S ...

  9. 使用 history 对象和 location 对象中的属性和方法制作一个简易的网页浏览工具

    查看本章节 查看作业目录 需求说明: 使用 history 对象和 location 对象中的属性和方法制作一个简易的网页浏览工具 实现思路: 使用history对象中的 forward() 方法和 ...

最新文章

  1. ${pageContext.request.contextPath}无效
  2. 用Transformer实现OCR字符识别!
  3. python类型转换-Python中如何进行数据类型转换?
  4. 走,去谷歌的机房逛逛
  5. mediawiki常用设置
  6. Service Mesh所应对的8项挑战
  7. java 从数据库取值_java 连接数据库取值问题
  8. Linux以下基于TCP多线程聊天室(client)
  9. linux ps用法大全,linux 性能篇 -- ps的用法
  10. VUE+Django项目编写
  11. Docker下载Nginx镜像并运行Nginx容器
  12. 人工智能NLP在金融领域的发展趋势和实践经验
  13. Codeforces407C Curious Array
  14. VSCode 代码格式化的快捷键
  15. 玩转你的开发板-1.4.第1季第4部分-朱有鹏-专题视频课程
  16. 目标检测 | 让YOLOv2告诉你Trick的力量
  17. isEmpty()和isBlank()的区别
  18. flask-项目结构
  19. 【动手学深度学习PyTorch版】19 网络中的网络 NiN
  20. 使用SQL语句修改MYSQL数据库密码

热门文章

  1. Python之王者荣耀文字游戏,以及小知识回顾
  2. 教师计算机基础知识培训简报,信息技术能力提升培训简报.doc
  3. 电力系统谐波影响及治理
  4. Qt QImage与OpenCV Mat转换
  5. ret2dl-resolve
  6. C语言:地址传递与传递
  7. 魔法王座微端不显示服务器,魔法王座无法登陆卡顿等常见问题解决方法
  8. 信用卡教育风险预测项目--kaggle算法实战
  9. 小程序canvas头像不显示解决办法
  10. 寒假作业81-100题