我一次性从数据库读取了10万条数据,然后循环做一些计算,循环过程中,涉及到的变量都会被下次循环覆盖掉,现在的情况是程序运行了一段时间之后,报内存溢出,为什么不是刚开始的时候就报内存溢出?按照我的理解,我并没有用变量一直去存运算结果,所以如果说内存溢出的话,应该就在一开始就报了啊。

回复内容:

我一次性从数据库读取了10万条数据,然后循环做一些计算,循环过程中,涉及到的变量都会被下次循环覆盖掉,现在的情况是程序运行了一段时间之后,报内存溢出,为什么不是刚开始的时候就报内存溢出?按照我的理解,我并没有用变量一直去存运算结果,所以如果说内存溢出的话,应该就在一开始就报了啊。

php version 5.5+

循环中使用yield关键字,迭代中的中间变量可以不占用额外的内存空间

例:

for($i = 1; $i <= 10; $i += 1)

yield $i;

在php中其实变量都是通过zval变量来保存,zend_uint refcount__gc 是该变量中的一个计数器,用来保存有多少变量。在变量生成时,其refcount=1,典型的赋值操作如$a = $b会令zval的refcount加1,而unset操作会相应的减1。在PHP5.3之前,使用引用计数的机制来实现GC,如果一个zval的refcount较少到0,那么Zend引擎会认为没有任何变量指向该zval,因此会释放该zval所占的内存空间。但,事情有时并不会那么简单。后面我们会看到,单纯的引用计数机制无法GC掉循环引用的zval,即使指向该zval的变量已经被unset,从而导致了内存泄露。

你在循环覆盖变量的时候,其实本质的recount值并没有减少,所以所占用内存并没有释放,最后肯定会爆炸。

解决方案:

ini_set(‘memory_limit’,’1024M’);

问题分析:

=。=没代码怎么分析。。。

可能原因:

读取数据不要时间啊?

变量覆盖之前生成的临时对象就不占内存啊?

你从数据库读取10w条数据的时候,估计就已经内存不足了吧

我印象中变量重新赋值,内存中的对象数据其实会COPY一份,用unset或者GC才会释放,不过我没找到相关资料。

内存占用因素很多,PHP是动态语言,内存管理操作是隐藏的,你用同一个变量看似用同一个内存区域,但事情上并不是。

相关标签:php

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php报内存溢出,php为什么运行了一段时间后才报内存溢出?相关推荐

  1. 数据库工具一段时间后打开报错:远程过程调用失败0x800706be

    1.原因可能是安装vs时自带更高版本的sql server服务造成的,只需要卸载Microsoft SQL Server 2012 Express LocalDB或 Microsoft SQL Ser ...

  2. c语言代码存放的区域 堆栈,C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)...

    BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 :数据 ...

  3. FlinK运行一段时间后任务任务自己挂掉的问题排查

    最近在做自定义实时报表,由于在前期测试Flink发现Flink拥有比较好的性能,并且天然支持窗口,所以在实时计算的时候,我们选择Flink在做计算框架.在所有的代码完成,代码准备上线的时候,发现Fli ...

  4. Tomcat运行一段时间后访问变慢分析历程

    主要查看三方面: 查看程序中的Session是否定时清空了 查看mysql是否有没有close的连接 查看Tomcat的内存设置,根据下列设置 环境运行一天或者几天,网站访问就很卡,手机端app访问页 ...

  5. ppt提示内存或系统资源不足_电脑使用一段时间后,提示“系统资源不足”,怎么办?...

    电脑使用一段时间后,提示"系统资源不足",特别是WIN7,经常会遇到这种情况.弹出这个提示后,无法运行某些软件,怎么解决呢?来看看吧··· 问题原因 因为当Windows每运行一个 ...

  6. 虚拟机运行一段时间后 自动挂起解决方法

    1.电源选项设置问题:请检查虚拟机的电源选项设置,确保其不会在一段时间后自动进入待机模式.您可以通过以下步骤更改电源选项设置: a. 在 Windows 操作系统中,打开控制面板,然后选择" ...

  7. 编写的Matlab程序在运行一段时间后速度会变慢

    我们用matlab编写程序进行数据运算的时候经常会遇到这种情况,就是编写完立马运行,运行速度会非常快,我们感到很满意.但是运行一段时间后,速度就不是那么理想了,恨不得推他一把.这是什么原因呢?通过一段 ...

  8. 加载MNIST报错:[WinError 10060] 由于连接方在一段时间后没有正确答复解决办法(亲测)

    转载:https://blog.csdn.net/landcruiser007/article/details/79346982 tensorflow加载mnist数据集,一些书上和博客中的代码如下: ...

  9. 在测试tensorBroad中在运行mnist_with_summaries.py时URLError:urlopen error [WinError 10060] 由于连接方在一段时间后没有正确答

    1,问题1 URLError: <urlopen error [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败.> 这个问题,是数据下 ...

最新文章

  1. 51CTO专访人人网黄晶:SNS网站后台架构探秘
  2. Linux 内核分析 之一:How Computer Works 实验
  3. requests.exceptions.TooManyRedirects: Exceeded 30 redirects
  4. WCF创建到使用到发布
  5. Android 11 修改libcore update-api 遇到的问题
  6. Oracle学习:分组数据(group by)与笛卡尔积
  7. LeetCode 1768. 交替合并字符串
  8. python 矩量法_矩量法:β二项分布
  9. python基础篇——元组
  10. android问卷分页显示,基于Android的问卷调查客户端题目分页加载实现.doc
  11. LINUX SHELL如何递归访问目录(处理包含空格的文件名)
  12. KSF—— 关键成功因素法
  13. HDU - How far away ?(DFS+vector)
  14. Obsidian笔记最新版本的功能Callouts,提升方便性和美观程度
  15. 阿里云自建k8s存储插件csi安装使用
  16. Pinyin4j使用手册
  17. 主流RGB灯,灯带通用C语言程序
  18. 微信营销如何提升转化率与购买率
  19. 成就系统实现(二)-功能分析
  20. Flink SQL 核心解密 —— 提升吞吐的利器 MicroBatch

热门文章

  1. 机器学习相关的一些术语
  2. python matplotlib图中插入表格
  3. Labview 模型导入Veristand问题
  4. Git #1 - 安装git bash
  5. collections模块之defaultdict
  6. 数字图像处理中的高通滤波和低通滤波
  7. K-Means聚类算法的原理及实现
  8. ExtJS之Store
  9. 漫步线性代数十九——快速傅里叶变换(上)
  10. 钉钉实现企业级微应用免登陆详解