【问题标题】:C# OpenXML memory leakC# OpenXML 内存泄漏
【发布时间】:2015-07-25 06:34:03
【问题描述】:

我注意到我的应用程序中存在内存泄漏并试图找出它。我不知道好的和免费的内存泄漏发现技术(有什么建议吗?)所以我让它变得简单——插入内存使用打印(有和没有 GC),然后深入挖掘最大泄漏的位置。可修复 我已经修复了,但有些我不能修复,因为它们在包内。就像这个非常简化的一样

using System;
using System.Threading;
using DocumentFormat.OpenXml.Packaging;

namespace WorkTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("0) " + System.GC.GetTotalMemory(true).ToString("000,000,000", Thread.CurrentThread.CurrentCulture));
            Console.WriteLine("Start");
            Console.WriteLine("1) " + System.GC.GetTotalMemory(true).ToString("000,000,000", Thread.CurrentThread.CurrentCulture));

            using (WordprocessingDocument wordPackage = WordprocessingDocument.Open(@"c:\tmp\a.docx", true))
            {
              // This is Open XML Format SDK 2.5 - v4.0.30319
              // It does nothing within this particular block/example 
            }
            Console.WriteLine("2) " + System.GC.GetTotalMemory(true).ToString("000,000,000", Thread.CurrentThread.CurrentCulture));
            Console.WriteLine("End");
            Console.WriteLine("3) " + System.GC.GetTotalMemory(true).ToString("000,000,000", Thread.CurrentThread.CurrentCulture));
        }
    }
}

通常它会产生类似的东西

0) 000,215,984
Start
1) 000,218,528
2) 000,325,472
End
3) 000,325,472

从小泄漏开始 - 步骤 0-1 是简单的输出。它吃的不多。只有3K,但它仍然是一些东西。步骤 2-3 相同,但它不吃任何东西。 好的。我同意。一些 IO 包可能需要一些内存。不好但可以理解。

第二个步骤 1-2 不是那么容易理解的。 “使用”甚至单独的块 {} 应该完全清理自己。他们没有。更糟糕。这个例子被简化了。实际上,每次在我的方法中执行此代码时,内存都消失了。在这个示例中,它是 90K。 100 个文档后为 9Mb。

使用所描述的方法,当调用 GC 消耗并且不返回内存时,我还发现我的应用程序中很少有地方。每次GC被调用的唯一结果是4K内存没了。不幸的是,我无法在简单的示例中重现它。

到目前为止,我只找到了一种解决方案 - 当内存变得至关重要时,我重新启动了我的应用程序。不是很好的解决方案,但我找不到更好的解决方案。

【问题讨论】:

  • 在这里试试这个链接 --> stackoverflow.com/questions/134086/… 我把它收藏了,因为那里有一些非常有用的建议/链接/答案
  • 我非常感谢有关内存泄漏对抗工具的帮助。我愿意!但是当我在 OpenXML 中发现内存泄漏时该怎么办?这就是我发布此示例的原因。我不知道如何应对这种内存泄漏——不要使用 OpenXML?还是窗户?
  • 我一直使用 OpenXML,通常不会出现内存问题。如果您阅读了我发布的链接中的所有答案,您会发现许多有关故障排除策略的博客文章和文章,而不仅仅是工具。
  • 我喜欢你的链接,也给它加了书签。谢谢。

标签: c# memory-leaks openxml-sdk


【解决方案1】:

好吧,如果我们坚持使用免费或处于生产环境中,我会使用ADPlus 创建内存转储并使用WinDbg 对其进行分析。你可以谷歌一下,那里有很多关于这个主题的知识。

但更简单的方法是在应用程序运行时附加内存分析器。我使用的分析器是商业的,但在 Visual Studio 2013 中还有一个内置的内存分析器。转到 ANALYZE -> Performance and Diagnostics 并选择 .NET memory allocation。

【讨论】:

    猜你喜欢
    • 2016-01-27
    • 2010-11-11
    • 2017-02-18
    • 1970-01-01
    • 2015-11-19
    • 2014-11-01
    • 2020-03-31
    • 2016-03-15
    • 2018-01-03
    相关资源
    最近更新 更多