我想在开始时说,我知道.NET程序的实际内存使用量和声明的内存使用量是不一样的。多年来我使用了很多.NET程序,并且认为学习如何编程并且可能对我发现的一些开源项目做出贡献会很有趣。
然而,在构建我的小应用程序并获得一些最小功能时,它似乎会带来巨大的内存成本。它是〜40kb,其中有一些图像,但是从20mb的内存开始,并且在执行一些操作后,它会上升到30s。
与我同时运行的其他.NET应用程序相比,它的大小是它们的3倍。
我认为由于我不熟悉编程,因此可能会遗漏一些内容。我查看了Visual Studio,发现了一个从调试版本发布到发布版本的设置,并尝试使用它进行发布,但没有发现差异。
我还缺少其他一些设置吗?或者我没有正确编写我的代码来解释这个巨大的差异?我想在尝试使用Windows Phone 7开发之前解决这个问题,这是我的目标,因为内存在那里会是一个更大的问题。
更新:程序是一个RSS阅读器,它只检查一个Twitter提要并将数据解析到一个列表框中,其中包含一些基于哈希标记的附加信息。我希望有一个免费或非常低成本的解决方案来解决这个问题,因为这只是我选择的一个爱好,因此高成本的专业级概要程序似乎对我的意图来说太贵了。
答案 0 :(得分:1)
我绝对同意Rob的意见,因为分析器会告诉您代码中是否存在任何内存泄漏或使用效率低下。 但是,你必须记住,即使你有一个小的.NET应用程序,你将(除了你自己的代码)加载CLR,JIT编译器,许多框架组件等等。另外,如果在分析你的应用程序后,GC预测你需要大量的堆内存,它可能会重新调整堆大小以允许快速分配等(如果内存资源存在压力,它可能会减小。
总而言之,显然较大的运行内存分配可能并不表示存在任何问题,但分析将允许您仔细检查此问题。
答案 1 :(得分:0)
使用内存分析器(http://www.google.co.uk/search?q=dot+net+memory+profiler - 我自己喜欢DotTrace),你应该能够找到造成这种情况的原因。< / p>
分析是最好的方法,因为否则你可能会“修复”甚至没有破坏的东西
答案 2 :(得分:0)
有一种猜测是,在轮询RSS源时,您不断创建新对象,即使您最终没有“使用”它们中的大多数,它们仍会驻留在内存中,直到垃圾收集器收集它们为止。这本身并不是问题,但它可能会使您的应用程序似乎占用更多内存。
答案 3 :(得分:0)
我最近遇到了类似的问题,发现使用Sysinternals的免费工具很有帮助:VMMAP
它基本上让您了解应用程序实际使用了多少内存以及Windows分配的位置。主要是Windows和.NET分配内存以使您的应用程序运行得更好并减少内存分配量。