2012-04-03 70 views
3

我有一個腳本,在數據庫的一些行上做了大量的處理(大量)。該腳本使用了很多對象,以及一些內部緩存機制。我如何才能知道我的所有內存在PHP中的位置?

在某些時候,我釋放了所有已使用的緩存,以避免只爲緩存的項目使用所有可用的RAM,但使用的內存不會減少。

我已經使用memory_get_usage(true)來確定腳本正在使用多少內存,但我沒有ideea如何檢測哪些對象仍在RAM中,仍然在吃內存。

簡單的解決方案是回溯所有對象,並確保沒有變量仍然活着並指向它們,並且所有內部緩存實際上都是free'd並且再次測試和測試並進行測試,但是我尋找一個工具或函數調用,它會告訴我「Z類中的變量Y有90%的RAM」,而不必知道和混淆我在這個腳本中使用的所有對象的內部。

+0

除非運行PHP的垃圾收集器,否則unsetting/nulling變量不會立即釋放內存。 GC運行很昂貴,並且PHP不會運行它,直到它必須,例如,當一個操作需要比當前可用的內存更多的內存時。 – 2012-04-03 12:46:45

回答

2

爲什麼不分析你的腳本?

使用xdebug打開Profiler並調查您的cachegrind文件正在發生什麼。

查看更多在這裏:http://www.xdebug.org/docs/profiler

更新:您可以通過使用與xdebug.trace_format都設置爲1結合xdebug.show_mem_delta參數來獲取一個簡單的HTML內存使用情況獲得更多的內存相關的信息。

檢查這個http://xdebug.org/docs/execution_trace和這個http://derickrethans.nl/xdebug-and-tracing-memory-usage.html得到一些想法。

+0

我沒有看到kcachegrind中的任何內存信息...任何ideea在哪裏尋找它?我看到的只是時間和函數調用次數... – Quamis 2012-04-03 14:47:35

+0

@Quamis,檢查我更新的答案 – mobius 2012-04-03 16:18:27

+0

我接受你的答案,因爲它「可能」可能工作。我不能測試它,因爲xdebug似乎有一個錯誤,它忽略了xdebug.trace_format,並且它總是假定它設置爲0.我在此期間找到了疊印並解決了我的問題,但是我對缺乏乾淨而簡單的工具(如果你不知道你想要找什麼,kcachegrind會吃掉你的耳朵) – Quamis 2012-04-03 18:30:51

相關問題