2012-09-18 52 views
3

我在C#,Framework 4中有一個應用程序。基本上,這個應用程序主要對事件做出反應並創建對象,釋放它們,創建數據庫連接並關閉它們。在C#應用程序中查找內存泄漏

現在,我們已經看到應用程序的過程有時會以非常奇怪的方式增長。我們有兩種不同的行爲:

  1. 應用程序增長到內存達到4 GB時,通常它應該保持在500 MB左右。後果 - >崩潰!
  2. 應用程序緩慢增長到1200 MB(30分鐘),然後突然縮小到500 MB(在一秒鐘內)...並且此過程每隔一段時間重複一次。這可以成爲垃圾收集器嗎?

現在,爲了向我們提供有關應用程序的更多信息,我想在我們的日誌文件中添加應用程序進程的大小。通過本機框架可能嗎?是否有可能知道在C#中的對象的大小?

我也找到了應用程序NetMemoryProfiler4,但我寧願使用嵌入式日誌記錄,如果可能的話!

+2

請原諒我的無知,但什麼是'莫'? – Adam

+0

使用內存分析器將爲您提供更多信息,並讓您更有效地定位泄漏,而不是日誌記錄。 – Oded

+2

你從未聽說過MegaOyte? –

回答

5

您需要內存分析器來調試此類問題。例如:

也看到the other question about memory leaks建議。

基本上,這歸結爲找到內存中的對象,而他們不應該這樣做。它可以是持有對其類的引用的事件處理程序,或持有對其父母的引用的一些對象集合等等。找到根本原因後,您可能需要重構應用程序以擺脫不必要的引用。這可以像添加被遺忘的事件退訂一樣簡單,但在非平凡的情況下可能需要應用一些結構設計模式。這部分是非常具體的應用程序。

0

也許Process班級是你正在尋找的東西。
使用Process myProcess = Process.GetCurrentProcess()來獲取當前進程。
然後你可以使用myProcesspropertiesWorkingSet64,PrivateMemorySize64等等。