2012-08-28 71 views
4

我有一個由多個組件組成的應用程序,每個組件都編譯成單個DLL,每個組件都運行多個線程。我有一個啓動這些組件的shell程序。我試圖跟蹤內存泄漏,它做我想要的嗎?

我在一個窗口CE 6環境中運行這個應用程序,這是唯一的程序(除了那些系統)。但是,隨着時間的推移,我發現在查看任務管理器窗口時分配的內存使用量正在緩慢增加。懷疑我的程序可能有內存泄漏我做了以下事情。

我去一個特定的組件,並創建一個每30分鐘一班調用下面的代碼Timer對象:

long memByte = GC.GetTotalMemory(false); 
Console.Write("Heap Memory: " + (memByte/1000).ToString() + "KB"); 

來自各地的互聯網,我認爲GetTotalMemory基本上讓我總讀管理的記憶系統。如果我的程序沒有內存泄漏問題,那麼我懷疑加班時會在繪製結果時得到某種類型的扁平線。否則,我會看到一個緩慢的增加。

我的問題是,GetTotalMemory實際上是否給我所有應用程序的總管理堆內存,還是它只給出了正在運行此代碼的當前組件使用的特定堆?

謝謝,

+0

「千字節」是1024字節,而不是1000字節。 –

+0

哎呀,謝謝你指出。 – Fylix

+0

我認爲他們重新定義千字節(KB)爲1000字節,而kibibyte(KiB)爲1024字節。 http://en.wikipedia.org/wiki/Kibibyte – rocketsarefast

回答

2

任務管理器向您顯示GC.GetTotalMEmory的不同信息。製作一個GC.GetTotalMemory的應用程序很可能會使用扁線,但會慢慢地使設備內存不足並崩潰。

GC.GetTotalMemory只查看GC堆,而不是分配的虛擬或物理內存。在GCHeap之外的P/Invokes和本地分配對GC.GetTotalMemory調用是透明的,這就是爲什麼試圖確定是否實際泄漏是一個相當無用的調用。

GC堆可以隨時增長和/或縮小,而不會對操作系統內存管理器進行任何調用,事實上它很常見。 GC每次從操作系統中抓取大塊,然後將其分割成更小的塊,因爲應用程序需要GC堆內存。

P/Invoke GlobalMemoryStatus如果您想跟蹤您在設備的控制面板中看到ovr的實際操作系統分配情況。

1

此方法返回您的進程的託管內存使用情況。全系統範圍內的全球範圍內的全球範圍內的全球範圍內的全球範圍內的全球範圍內的全球範圍內。

您的進程可能甚至沒有權限爲其他進程查詢內存。