2010-12-09 45 views
2

我有一個使用POE的應用程序,它有大約10個會話執行各種任務。隨着時間的推移,應用程序開始消耗越來越多的RAM,即使應用程序在80%的時間內處於空閒狀態,該使用率也不會下降。目前我唯一的解決方案是經常重啓這個過程。我能做些什麼來找出導致我的程序隨着時間消耗大量內存的原因?

我不能讓我意識到它是很難得到幫助,在這裏發佈我的代碼,但也許有人可以告訴我,我能做些什麼找到自己?

+1

請參閱[常見Perl內存/引用泄漏模式?](http://stackoverflow.com/questions/2223721/common-perl-memory-參考泄漏模式)和[Perl內存使用情況分析和泄漏檢測](http://stackoverflow.com/questions/1359771/perl-memory-usage-profiling-and-leak-detection)和[如何找到內存泄漏在長期運行的Perl程序?](http://stackoverflow.com/questions/429254/how-can-i-find-memory-leaks-in-long-running-perl-program)和[是否有任何工具用於查找我的Perl程序中的內存泄漏?](http://stackoverflow.com/questions/295385) – Ether 2010-12-09 17:15:15

回答

2

不要指望進程大小減少。內存不會釋放回操作系統,直到進程終止。

這就是說,你可能在某個數據結構參考循環? AFAIK,perl垃圾回收器無法整理參考循環。

您是否在任何地方使用任何XS模塊?這些內部可能存在泄漏。

+0

因此,如果內存不釋放回操作系統那麼用法會繼續增長? 在我使用的其中一個模塊的依賴項中可能存在XS模塊。我也使用HTML :: TreeBuilder,它的文檔說明我應該明確地調用delete()方法將其從內存中銷燬,我已經在做這件事。 – perlit 2010-12-09 06:44:43

1

猜測:你的程序執行一個循環,只要它運行;在這個循環中,可能每次發生某種情況時都會爲緩衝區(或更多)分配內存;由於範圍永遠不會退出,所以內存仍然不會被清理。我建議你檢查一下這樣的事情。如果是這種情況,請將分配代碼放置在您從循環調用的子集中,並將其放在範圍之外,然後清理乾淨,然後返回到循環。

1

看起來Test::Valgrind是用於搜索內存泄漏的工具。雖然我從來沒有使用過它(但是我使用了帶有C源代碼的valgrind)。

1

一種技術是定期將$ POE :: Kernel :: poe_kernel的內容轉儲爲時間或序列名稱的文件。 $ poe_kernel是跨越所有已知會話和堆的內容的樹的根。如果引用泄漏的內存,快照應單調增長。通過將早期快照與以後的快照區分開來,您將能夠發現泄漏的內容。

可以導出POE_ASSERT_DATA = 1,以使POE的內部數據一致性檢查。我不指望它會出現問題,但如果發生問題,我會很樂意收到錯誤報告。

1

Perl無法解析參考環。或者你在殭屍(可以經由PS AXL檢測),或者你有內存泄漏(參照圈/圈)

有一噸的程序來檢測內存泄漏。 strace,mtrace,Devel :: LeakTrace :: Fast,Devel :: Cycle

相關問題