2011-11-20 105 views
1

我在我的代碼中有一個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?

回答

3

你可能沒有看到「內存泄漏錯誤」,你不只是看到這些。你看到的可能是允許的內存耗盡錯誤,這意味着你的腳本超過了php.ini中定義的允許的最大內存限制。要更改限制,請查看core php.ini directives的手冊頁。您會在資源限制下找到memory_limit

至於gc_collect_cycles(),功能仍然是undocumented,這是一個很好的暗示不使用它。你讀的可能是theory behind collecting cycles in PHP。該函數報告的是沒有收集任何週期,這可能意味着首先沒有內存泄漏錯誤消息。

我建議你避免在PHP中進行垃圾收集,直到它被正確記錄並且你理解了涉及的基礎知識。

+0

謝謝。得到它了。但仍然有錯誤。我想我應該把我的長計算縮小到一些部分! – Netmoon

+1

「沒有收集到任何循環,這可能意味着首先沒有內存泄漏」這並不意味着這一點。在託管環境中,當不再真正使用對象時,會使對象保持活動狀態,從而創建內存泄漏。即使是100萬個GC集合也不能清除這些變量。這就是爲什麼他們是*泄漏*。收集只檢查哪些變量未被使用,並釋放他們先前佔用的內存插槽。 –

+0

@YamMarcovic你是對的,但答案是在問題的背景下。我已經重述了這句話。 – user39596