如果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(), "

";

}

?>

运行以上代码,你会发现,内存使用量本应该不变才对,可实际上却是不断增加,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(), "

";

}

?>

幸运的是这个Bug在PHP5.3的CVS代码中已经被修复了。

递归终止条件,一般有多种方式:

1. 添加递归深度参数到递归函数的参数中

每次调用深度加一,在函数体中添加条件语句,当深度超过某个值时强行return;

2. 引入元素栈结构,每次递归的一些需要记录的内容,通常会压入栈中,适当的时候再弹出

在函数体中,添加条件语句,判断栈大小或者栈元素,达到条件时进行return;

php递归内存,php递归内存怎么释放相关推荐

  1. 从结构体、内存池初始化到申请释放,详细解读鸿蒙轻内核的动态内存管理

    摘要:本文带领大家一起剖析了鸿蒙轻内核的动态内存模块的源代码,包含动态内存的结构体.动态内存池初始化.动态内存申请.释放等. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列九 动态内存Dyna ...

  2. 释放变量所指向的内存_前端基础突破(二)内存回收与内存泄漏

    垃圾回收的必要性? 在程序中,我们定义了许多变量,变量存储的在内存中,这时就需要一套机制来管理内存.在javascript中,并没有提供对应的api给开发者直接手动控制内存的申请和回收,因为javas ...

  3. python释放变量内存_Python变量内存管理

    一.变量存哪了? x = 10 当我们在p1.py中定义一个变量x = 10,那么计算机把这个变量值10存放在哪里呢了?我们回顾计算机的三大核心组件为:CPU.内存和硬盘.一定不是CPU,那是存放在内 ...

  4. C++之内存管理:申请与释放

    目录 前言 1.C/C++内存分布 1.1虚拟内存分段 1.2理解一些概念 1.2.1栈帧向下增长 1.2.2堆向上生长 1.2.3栈和堆会碰撞吗? 1.2.4关于const的说明 2.C语言中动态内 ...

  5. 清理备用内存/关闭备用内存(备用内存占用过高且不自动释放)

    清理备用内存/关闭备用内存 前言 备用内存介绍 清理备用内存 休眠再唤醒 RAMMap 关闭备用内存 禁用SysMain服务 开启虚拟内存(可忽略) 总结 前言 大家在使用Win7及以上系统时(本文内 ...

  6. 释放参数BSTR使用误区以及隐藏的内存破坏和内存泄漏

    PS:明天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘.目前又不当COO,还是得用心记代码哦! BSTR应用误区以及隐藏的内存损坏和内存泄漏 作者:magictong 简介 ...

  7. 关于堆内存和栈内存释放

    js 中的内存分为堆内存和 栈内存 堆内存:存储引用类型值 (对象:键值对 函数:代码字符串) 栈内存: 提供JS代码执行的环境和存储基本类型值 堆内存释放 让所有引用堆内存空间地址的变量赋值给Nul ...

  8. 05.内存管理:动态申请和释放内存

    动态分配内存,进行内存管理 参考: 伙伴算法原理简介 linux 0.11源码 本文主要针对Linux0.11的malloc和free进行分析.是一种类似伙伴系统的内存管理方法,不过伙伴系统的内存通常 ...

  9. Linux系统内存不够用怎么办?释放Linux内存的教程

    在Linux下操作频繁时,物理内存会被快速用完,当操作结束后,物理内存没有被正常的释放,而一直当作caching,影响系统的正常运行,今天就来谈谈如何能释放这一部分被占用的内存. 1.打开Linux命 ...

  10. python释放变量内存_Python尚学堂高淇|1113引用的本质栈内存,堆内存,内存的示意图,标识符,变量的声明初始化,垃圾回收机制...

    011-引用的本质-栈内存和堆内存-内存的示意图在Python当中,变量也成为:对象的引用,因为,变量的存储就是对象的地址变量通过地址引用了对象变量位于堆内存(压栈,出栈等细节,后续再介绍)对象位于: ...

最新文章

  1. matlab ezplot hold,matlab中的ezplot函数
  2. python操作excel-自动化办公:python 操作Excel
  3. Android性能优化(3)
  4. 同一服务器 数据库间 不同表 的查询
  5. eclipse中出现Context startup failed due to previous errors错误解决方法
  6. AutoMapper 使用实践
  7. Mr.J--Bootstrap使用
  8. Deepin使用苹果主题
  9. 创建Oracle定时任务
  10. 竞品分析:网易云音乐和QQ音乐,音乐类app的战场
  11. 国家代号(CountryCode) - 常用国家地区代码和国际电话代码
  12. Win7 和 xp 双系统安装
  13. FlashFXP绿色版
  14. 计算机语言描述正确,关于计算机语言的描述,正确的是( )
  15. 债券收益率预测模型_ARIMA模型在中国移动债券收益预测中的应用
  16. 智库说 | 徐远:数字时代的城市潜力
  17. JVM-内存区域 堆、方法区,虚拟机栈、程序计数器详解
  18. 如何在把微信公众号生成链接
  19. cesium 使用entities、primitives添加的模型并且改变模型颜色
  20. ensp 交换机与路由器ospf_—华为数通eNSP模拟实验15:交换机对接路由器

热门文章

  1. War3 游戏内存管理机制
  2. Android安全[测试环境vuln-demopwn]
  3. 开心汽车将与海淘车合并:前者4年亏损2亿美元,股权变更或遇阻
  4. python外星人入侵代码提示has no attri_【Python】pygame 外星人入侵, 出现AttributeError, 但是找不到错误?...
  5. maven工程配置私库
  6. Python爬虫实战| Python爬取英雄联盟高清壁纸
  7. java pattern.quote_Java Pattern quote(String)用法及代码示例
  8. RocketMQ集群部署方案(DLedger)
  9. 2021金九银十,蚂蚁金服Java岗内推
  10. 《深入浅出通信原理》阅读引导