2011-04-19 137 views
2

我一直在使用「.NET Memory Profiler」來分析WinForm的應用程序。.NET WinForm內存消耗

根據windows任務管理器的說法,我似乎無法理解我的應用程序如何增長到1GB,然後是2GB,然後是3GB的使用情況。

使用該工具的專用字節和「所有堆中的總字節數」僅顯示爲70MB左右。在我的掛件實例列表的頂部,它們大部分是String,或者WeakReference是很多小對象。

所有的應用程序正在做的是顯示從數據庫加載數據的表單。我重複約100次的形式的顯示/處理循環,並且增長是連續的。

我試着約3現在內存分析工具和他們都不給我看這個地方巨大的內存佔用量是從哪裏來的。

任何人都可以幫助或猜測它可能是什麼?

謝謝。

+0

您是從您的IDE分析可執行文件或調試版本嗎? – taylonr 2011-04-19 20:56:49

+0

我正在調試內置調試模式的EXE,而不是通過IDE。 – 2011-04-19 20:57:32

+1

這實際上是一個用vb.net編寫的應用程序嗎?然後WeakReference泄漏預計。 – 2011-04-19 21:07:51

回答

0

我發現,高CPU負載的垃圾收集往往變得非常低的優先級,以負責清理未使用的內存將只關火.NET庫時,他們絕對有必要,儘管引用計數的下一個管理對象將歸零。如果有可能儘量把你的代碼一些故意的Thread.Sleep調用簡單地接受一個事實,即它是一個記憶體豬和希望,邏輯將允許你的系統運行,將有「奇」內存使用情況,你從來沒有說過任何事情都會中斷,它只是具有虛幻的內存空間。

3

根據windows任務管理器,我似乎無法理解我的應用程序如何增長到1GB,然後是2GB,然後是3GB的使用情況。

這是因爲從任務管理器中的計數器是「工作集」苔絲Ferrandez在this article

指出,有一個叫 工作一套簡化的另一個櫃檯由多少內存在 當前或最近被 進程中的線程所觸及的內存或近似 進程 所使用的內存當前在RAM中的內存量。工作組 計數器可能是有趣的,如果你 有太多的分頁和 在同一個盒子 競爭有關的RAM許多工藝問題,但爲了 確定多少內存是使用 (保留或定向)它 提供很少或根本沒有幫助。

MSDN article工作集(重點煤礦)

工作集

這套內存頁面 (分配給一個 進程的內存區域)最近使用的線程 在一個過程中。如果 上的可用內存超過指定的 閾值,則頁仍保留在進程的工作集中,即使它們未被使用。當可用內存低於指定閾值 時,從工作集中刪除的頁面爲 。如果需要這些 頁面,他們將 退回到工作集合 之前他們離開主內存並且 可用於其他進程 使用。

+0

感謝康拉德。我無法理解的是,當Windows只運行在最大3GB的RAM盒上時,它如何讓它消耗大量的RAM。隨着Visual Studio的開放和其他許多事情的發展,它肯定會溢出可用RAM的數量。我從來沒有見過這種非託管語言的行爲,肯定是不合理的?運行數天的Visual Studio平均爲我消耗400mb。 – 2011-04-19 21:27:22

+1

@MeshMan我的猜測是,你沒有任何其他進程競爭RAM,所以它不修剪工作集,你可能有一個非常大的頁面文件 – 2011-04-19 22:02:57

5

這是VB.NET應用程序的一個已知問題嗎?

是的。這是Edit + Continue支持編譯到可執行文件中的副作用。它受到WithEvents關鍵字聲明的任何事件的影響。 WeakReference跟蹤這些事件實例。問題是,如果您在沒有調試器的情況下運行應用程序,那些WeakReference會泄漏。進程消耗內存的速率高度依賴於創建類的多少個實例。每個對象每個事件泄漏16個字節。

解決方法很簡單,不是而是在沒有調試器的情況下使用應用程序的Debug版本。只使用發佈版本。當然,只將發佈版本發佈給您的客戶。

+0

+1。這是一個指向相關[Microsoft知識庫文章](http://support.microsoft.com/?kbid=919481)的鏈接,僅爲了完整。它不會給Hans的答案添加任何東西 – MarkJ 2011-04-20 08:31:10

+0

正如你可能知道的那樣,在發佈版本中,符號調試信息沒有被髮出,並且代碼執行被優化,這樣最終可執行文件的大小比調試可執行文件的大小要小。但是,首先檢查您在調試和發佈配置中指定的設置(如何發出符號調試信息)(右鍵單擊您的win窗體項目 - >屬性 - >生成選項卡 ​​- >高級... - >調試信息設置),然後想想你想要他們是什麼。 – Manoj 2017-02-10 18:44:44