我正在努力解决一些内存使用问题。总体而言,我的应用程序会收集一些数据值,并使用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