我正在努力解決一些內存使用問題。總體而言,我的應用程序會收集一些數據值,並使用C1 WPF圖表和數據網格將它們可視化,最終將所有內容都放入PDF報告中。.NET進程內存使用率= 5x CLR堆內存?
使用YourKit分析我的進程我面臨的情況是,CLR堆大小是〜120MB(這一切都很好),而進程內存大小是〜580MB。這幾乎是我實際CLR堆大小的內存消耗的5倍。我的CLR峯值大小爲220MB,而710MB的進程內存分配。
我很清楚,我的對象堆,堆棧等需要一些開銷。在Java JVM中,我習慣的典型因素約爲1.5倍。
如何解釋這種過多的內存開銷?這個過程是否僅僅分配了免費的備用堆空間?如果是的話,這是否解釋了710MB與220MB?
非常感謝您的寶貴和廣泛的筆記特別是。有關.NET內存分配的解剖和潛在問題。就我而言,它終於證明是通過GDI +使用大塊存儲器的C1圖形組件。作爲一名Java專家,我完全不解這個.NET內存分析器工具。最後,我們必須通過限制那些C1圖形組件的使用來解決這個問題。 – 2012-08-23 08:53:38
很高興幫助。我必須用WinDbg調試許多內存轉儲,這已經教會了我很多。在使用第三方組件時,我會密切關注兩件事:首先,確保它們正在處理中,然後密切關注您的應用程序正在使用的Handles數量。這可以通過使用TaskManager(確保Handles col可見)或SysInternals ProcessExplorer輕鬆完成。通常,您將使用'using()'語句來確保組件及時處理。不過,我不熟悉WPF,所以這可能已經被框架所照顧。 – 2012-08-23 14:53:49
Ben,你是怎麼知道GDI +在消耗內存的? – RollRoll 2013-08-08 18:09:19