当前位置: 首页 > 编程笔记 >

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

长孙泉
2023-03-14
本文向大家介绍PHP对象递归引用造成内存泄漏分析,包括了PHP对象递归引用造成内存泄漏分析的使用技巧和注意事项,需要的朋友参考一下

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

<?php
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没有完全生效。

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

<?php
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程序设计有一定的参考价值。

 类似资料:
  • 我有一个系统,其中许多线程产生的日志将被插入到一个NoSql后端。为了减少网络流量,我在服务器和后端之间引入了一个缓冲区。 环境是: Java,JSP,Spring MVC,JDK 1.7 Apache-tomcat-6 使用的缓冲区是java中的ConcurrentLinkedQueue。还实现了一个DBPushThread来每5秒从队列中获取日志,并将它们插入backened。我们使用offe

  • 本文向大家介绍造成内存泄漏的操作有哪些?相关面试题,主要包含被问及造成内存泄漏的操作有哪些?时的应答技巧和注意事项,需要的朋友参考一下 以前使用"引用计数"的时候, 还挺多的, 现在都使用"标记清除"好很多了 最起码循环引用之类的, 不会再内存泄漏了 我觉得比较可能的是, 创建了时间循环, setInterval, 但是没有没有释放掉, 这个比较容易造成内存泄漏

  • 在MAT工具中分析了堆转储后。泄漏嫌疑人说:“”加载的一个“java.util.TaskQueue”实例占用680,207,896(82.39%)字节。该实例由org.apache.tomcat.util.threads.taskThread@0xC1B52018 ajp-bio-8009-exec-243引用,由“java.net.urlClassLoader@0xCE67A9B8”加载。内存积

  • 因为pnValue是保存动态分配的整数的地址的唯一变量,所以当pnValue被销毁时,不再有对动态分配的内存的引用。这被称为内存泄漏。因此,动态分配的整数不能被删除,因而不能被重新分配或重用。{引自LearnCpp。} 为什么pnValue保存动态分配整数的地址?如果指针只是指向地址,为什么破坏指针会影响地址?这是否意味着在动态分配的整数中,我们必须总是有指针,因为指针以某种方式是地址?

  • 问题内容: 我认为我的android应用正在泄漏内存。我不是绝对确定这是问题所在。 应用程序打开时经常崩溃,并且logcat尝试加载位图图像时会显示“内存不足”异常。 崩溃后,我重新打开了该应用程序,它运行正常。Logcat会显示许多“ gc”,并且JIT表会不时地向上调整大小,而不会向下调整,直到应用程序因内存不足错误而崩溃。 这听起来像是内存泄漏吗?如果是这样,我该如何定位和关闭泄漏点。 这是

  • 问题内容: 我一直在追寻内存泄漏(由“ valgrind –leak-check = yes”报告),它似乎来自ALSA。这段代码已经存在于自由世界中一段时间​​了,所以我猜这是我做错的事情。 输出看起来像这样: 并继续一些页面 这是由于我在一个项目中使用ALSA并开始看到这种巨大的泄漏……或者至少是所说泄漏的报告。 所以问题是:是我,ALSA或valgrind在这里遇到问题吗? 问题答案: ht