• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

php为什么运行了一段时间后才报内存溢出?

php 搞代码 4年前 (2022-01-22) 16次浏览 已收录 0个评论
文章目录[隐藏]

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

回复内容:

我一次性从数据库读取了10万条数据,然后循环做一些计算,循环过程中,涉及到的变量都会被下次循环覆盖掉,现在的情况是程序运行了一段时间之后,报内存溢出,为什么不是刚开始的时候就报内存溢出?按照我的理解!本文来源gaodai#ma#com搞*!代#%^码网5

搞gaodaima代码

,我并没有用变量一直去存运算结果,所以如果说内存溢出的话,应该就在一开始就报了啊。

php version 5.5+

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

例:

<code>for($i = 1; $i <= 10; $i += 1)        yield $i;</code>

在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值并没有减少,所以所占用内存并没有释放,最后肯定会爆炸。

解决方案:

<code>ini_set(‘memory_limit’,’1024M’);</code>

问题分析:

<code>=。=没代码怎么分析。。。</code>

可能原因:

<code>读取数据不要时间啊?变量覆盖之前生成的临时对象就不占内存啊?</code>

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

我印象中变量重新赋值,内存中的对象数据其实会COPY一份,用unset或者GC才会释放,不过我没找到相关资料。
内存占用因素很多,PHP是动态语言,内存管理操作是隐藏的,你用同一个变量看似用同一个内存区域,但事情上并不是。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:php为什么运行了一段时间后才报内存溢出?

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址