【问题标题】:Overly high memory usage in a C# programC# 程序中的内存使用率过高
【发布时间】:2011-05-15 00:55:52
【问题描述】:

我想在开始时说,我知道.NET 程序的实际内存使用量和声称的内存使用量是不一样的。多年来,我使用了许多 .NET 程序,并且认为学习如何编程并可能为我发现的一些开源项目做出贡献会很有趣。

但是,在构建我的小应用程序并从中获得一些最小功能时,似乎需要付出巨大的内存成本。它约为 40kb,其中包含一些图像,但从 20mb 的内存开始,在执行一些操作后,它会上升到 30 秒。

与我同时运行的其他 .NET 应用程序相比,它的大小是它们的 3 倍以上。

我认为我可能缺少一些东西,因为我是编程新手。我环顾了 Visual Studio,发现了一个从调试到发布的设置,并尝试使用该设置进行发布,但没有发现差异。

我还缺少其他一些设置吗?还是我没有正确编写代码来解决这个巨大的差异?我想我应该在尝试使用 Windows Phone 7 开发之前解决这个问题,这是我的目标,因为内存将是一个更大的问题。

更新: 程序是一个 RSS 阅读器,它只检查 twitter 提要并将数据解析到一个列表框中,其中包含一些基于哈希标签的附加信息。我希望有一个免费或非常低成本的解决方案来解决这个问题,因为这只是我的一个爱好,所以高成本的专业级分析程序似乎对我的意图来说太贵了。

【问题讨论】:

  • 如果您的应用在做什么没有一些线索,很难给出答案...但是 WPF 等不是免费的。
  • 当你说“记忆”时,你到底指的是什么?虚拟机提交大小? (私有)工作集?

标签: c# wpf visual-studio-2010 memory


【解决方案1】:

我绝对同意 Rob 的观点,分析器会告诉您代码中是否存在任何内存泄漏或使用效率低下的问题。 但是,您必须记住,即使您有一个小型 .NET 应用程序,您也将(除了您自己的代码之外)加载 CLR、JIT 编译器、大量框架程序集等。此外,如果在分析您的应用程序之后 GC预测您将需要大量堆内存它可能会向上重新调整堆大小以允许快速分配等,(如果内存资源有压力,它可能会减小大小。

因此,总而言之,一个明显较大的运行内存分配可能并不表示有任何问题,但分析可以让您仔细检查这个问题。

【讨论】:

    【解决方案2】:

    使用内存分析器(http://www.google.co.uk/search?q=dot+net+memory+profiler - 我自己喜欢 DotTrace),您应该能够找到造成这种情况的原因。

    分析是最好的方法,否则你可能会“修复”一些甚至没有被破坏的东西

    【讨论】:

    • 花费 150 美元以上对我来说并不是一个真正的选择。考虑到我正在学习编程作为一种不错的廉价业余爱好。
    【解决方案3】:

    一种猜测是,您在轮询 RSS 提要时不断创建新对象,即使您最终没有“使用”其中的大部分,它们仍然驻留在内存中,直到垃圾收集器来收集它们。这本身不是问题,但它可能会使您的应用程序似乎占用更多内存。

    【讨论】:

      【解决方案4】:

      我最近遇到了类似的问题,发现使用 Sysinternals 的这个免费工具很有帮助:VMMAP

      它基本上让您了解应用程序实际使用了多少内存,以及 Windows 分配的位置与分配。这主要是 Windows 和 .NET 分配内存以使您的应用程序更好地运行并减少内存分配量的情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-18
        • 2015-04-02
        • 2014-02-26
        • 2016-10-05
        • 2011-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多