【问题标题】:Why isn't garbage collection being activated in my code?为什么我的代码中没有激活垃圾收集?
【发布时间】:2011-11-20 10:52:23
【问题描述】:

我的代码中有一个foreach 语句,每次迭代都会计算大量数据并进入下一次迭代。我运行了这段代码,但是当我阅读日志时,我看到了内存泄漏错误。

PHP.net 表示,当这种情况发生时,使用 gc_enabled() 是处理这种情况的好方法。

我已将这些行添加到 foreach 块的最后一行:

echo "Check GC enabled : " . gc_enabled();
echo "Number of affected cycles : " . gc_collect_cycles();

这是输出:

Check GC enabled : 1
Number of affected cycles : 0

为什么存在循环,但受影响的循环为0?

【问题讨论】:

    标签: php memory memory-leaks


    【解决方案1】:

    您可能没有看到“内存泄漏错误”,而不仅仅是看到这些。您看到的可能是允许的内存耗尽错误,这意味着您的脚本超出了 php.ini 中定义的允许的最大内存限制。要更改限制,请查看 core php.ini directives 的手册页。您会在资源限制下找到memory_limit

    至于gc_collect_cycles(),函数还是undocumented,这是一个很好的提示,不要使用它。你读到的可能是theory behind collecting cycles in PHP。该函数报告的是没有收集任何循环,这可能意味着首先没有内存泄漏错误消息。

    我建议您避免在 PHP 中进行垃圾收集,直到它被正确记录并且您了解所涉及的基础知识。

    【讨论】:

    • 谢谢。知道了。但仍然有错误。我想我应该把我的长计算缩小到一些部分!
    • “没有收集到任何周期,这可能意味着首先没有内存泄漏”这真的不是那个意思。在托管环境中,如果您在对象不再真正使用时保持其活动状态,则会产生内存泄漏。即使 1,000,000 次 GC 收集也不会清除这些变量。这就是他们泄漏的原因。收集只检查哪些变量没有被使用并释放它们之前占用的内存槽。
    • @YamMarcovic 你是对的,但答案是在问题的上下文中。我已经改写了这句话。
    • 答案不准确,部分错误,您修复它很好。
    • @Netmoon 您可以尝试在 php.ini 中设置更大的内存限制,当然也可以将您的计算分解为内存密集程度较低的部分。
    猜你喜欢
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 2011-01-16
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多