2017-02-14 57 views
-2

我們有一個相當複雜的Delphi應用程序,它使用.NET程序集。 我們使用FastMM作爲我們的內存管理器。Delphi Windows桌面應用程序 - > 513 MB內存使用啓動 - > 32.1 MB後50分鐘的空閒狀態

我們已經遇到了EOutOfMemory異常。所以我一直在調查這一點。我們懷疑我們在Delphi對象之間有一些循環引用。或者也許一些.NET對象持有對Delphi對象的引用,從而阻止它們被釋放。

到目前爲止,我還沒有發現任何可以改變的事情,這真的令人沮喪,因爲顯然我們在某個地方有問題。

但今天,我憑藉純粹的機會發現了一些東西。 當我們的應用程序啓動任務管理器報告約。 513 MB正在使用的內存。 我剛剛啓動它,但不得不離開午餐。 當我回來時,偶然發現應用程序現在只用了75 MB。 奇怪我以爲,一定是墜毀或我假設的東西。不,完全沒有,應用程序運行完美。 我做了什麼 - >什麼都沒有。讓它閒置。 我們的應用程序是一個Windows桌面應用程序。在空閒狀態下沒有太多的事情正在進行。

於是我開始進一步研究。 它是可重複的。隨着時間的推移,內存消耗開始大幅下降。 後約。 50分鐘已經達到32.1 MB!

我已經監視了.NET垃圾收集器性能計數器,並沒有什麼大的變化。因此,我懷疑問題在德爾福方面 - > FastMM上的哪一點。

雖然我不是FastMM的專家。我確信並且FullDebugMode未啓用。 有沒有其他人經歷過這樣的事情? 任何提示/想法FastMM內可能配置錯誤?

非常感謝!

+0

@DavidHeffernan你似乎有很多關於Delphi-內存管理器的經驗。 :-)。如果您有任何類似的經驗,您可以發表評論,非常感謝。謝謝! – santiagoIT

+4

您無法在此處向特定用戶提出問題,並且您無法使用@符號對他們進行ping操作,除非他們先評論或者您正在評論他們的答案。這不是社交媒體網站,您也不會從您的首選用戶那裏獲得個人技術支持。 –

+0

@KenWhite感謝您的信息!很高興知道。希望他會遇到這個問題。我從其他SO問題中知道David使用他自己的MemoryManager並嘗試了幾次。所以他的投入會很有價值。 – santiagoIT

回答

1
  1. 的OS有時標識空閒應用的未使用的RAM,以釋放它對於其它應用,則它不計數的任何更多的由該應用所消耗的資源。

  2. 在這樣的混合應用程序中,我猜大多數內存都是由.Net框架保留的,因爲它的垃圾收集器。 GC將以空閒模式運行,並釋放/壓縮其內存。這可能是發生了什麼事。在您的應用中添加一些日誌到monitor the actual FastMM4 heap consumption

  3. 可能存在內存泄漏,並且您達到了32位進程的2GB限制。嘗試set the 3GB flag for the exe。或者切換到64位可執行文件 - 這會讓你的.Net代碼開心。運行FastMM4 in memory leak reporting mode以確保應用程序安全。

相關問題