php报内存溢出,php为什么运行了一段时间后才报内存溢出?
我一次性从数据库读取了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为什么运行了一段时间后才报内存溢出?相关推荐
- 数据库工具一段时间后打开报错:远程过程调用失败0x800706be
1.原因可能是安装vs时自带更高版本的sql server服务造成的,只需要卸载Microsoft SQL Server 2012 Express LocalDB或 Microsoft SQL Ser ...
- c语言代码存放的区域 堆栈,C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)...
BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 :数据 ...
- FlinK运行一段时间后任务任务自己挂掉的问题排查
最近在做自定义实时报表,由于在前期测试Flink发现Flink拥有比较好的性能,并且天然支持窗口,所以在实时计算的时候,我们选择Flink在做计算框架.在所有的代码完成,代码准备上线的时候,发现Fli ...
- Tomcat运行一段时间后访问变慢分析历程
主要查看三方面: 查看程序中的Session是否定时清空了 查看mysql是否有没有close的连接 查看Tomcat的内存设置,根据下列设置 环境运行一天或者几天,网站访问就很卡,手机端app访问页 ...
- ppt提示内存或系统资源不足_电脑使用一段时间后,提示“系统资源不足”,怎么办?...
电脑使用一段时间后,提示"系统资源不足",特别是WIN7,经常会遇到这种情况.弹出这个提示后,无法运行某些软件,怎么解决呢?来看看吧··· 问题原因 因为当Windows每运行一个 ...
- 虚拟机运行一段时间后 自动挂起解决方法
1.电源选项设置问题:请检查虚拟机的电源选项设置,确保其不会在一段时间后自动进入待机模式.您可以通过以下步骤更改电源选项设置: a. 在 Windows 操作系统中,打开控制面板,然后选择" ...
- 编写的Matlab程序在运行一段时间后速度会变慢
我们用matlab编写程序进行数据运算的时候经常会遇到这种情况,就是编写完立马运行,运行速度会非常快,我们感到很满意.但是运行一段时间后,速度就不是那么理想了,恨不得推他一把.这是什么原因呢?通过一段 ...
- 加载MNIST报错:[WinError 10060] 由于连接方在一段时间后没有正确答复解决办法(亲测)
转载:https://blog.csdn.net/landcruiser007/article/details/79346982 tensorflow加载mnist数据集,一些书上和博客中的代码如下: ...
- 在测试tensorBroad中在运行mnist_with_summaries.py时URLError:urlopen error [WinError 10060] 由于连接方在一段时间后没有正确答
1,问题1 URLError: <urlopen error [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败.> 这个问题,是数据下 ...
最新文章
- 51CTO专访人人网黄晶:SNS网站后台架构探秘
- Linux 内核分析 之一:How Computer Works 实验
- requests.exceptions.TooManyRedirects: Exceeded 30 redirects
- WCF创建到使用到发布
- Android 11 修改libcore update-api 遇到的问题
- Oracle学习:分组数据(group by)与笛卡尔积
- LeetCode 1768. 交替合并字符串
- python 矩量法_矩量法:β二项分布
- python基础篇——元组
- android问卷分页显示,基于Android的问卷调查客户端题目分页加载实现.doc
- LINUX SHELL如何递归访问目录(处理包含空格的文件名)
- KSF—— 关键成功因素法
- HDU - How far away ?(DFS+vector)
- Obsidian笔记最新版本的功能Callouts,提升方便性和美观程度
- 阿里云自建k8s存储插件csi安装使用
- Pinyin4j使用手册
- 主流RGB灯,灯带通用C语言程序
- 微信营销如何提升转化率与购买率
- 成就系统实现(二)-功能分析
- Flink SQL 核心解密 —— 提升吞吐的利器 MicroBatch