C#OpenXML内存泄漏

时间:2015-05-13 19:42:30

标签: c# memory-leaks openxml-sdk

我注意到我的应用程序中存在内存泄漏并试图找到它。我不知道好的和免费的内存泄漏发现技术(任何建议?)所以我简单 - 插入内存​​使用打印(有和没有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内存消失的唯一结果。不幸的是,我无法用简单的例子重现它。

到目前为止,我只发现了一个解决方案 - 当内存变得严重时,我重启了我的应用程序。不是很好的解决方案,但我找不到更好的解决方案。

1 个答案:

答案 0 :(得分:1)

好吧,如果我们坚持免费或者我们处于生产环境中,我会使用ADPlus来创建内存转储,并WinDbg来分析它。你可以谷歌周围有很多关于这个主题的知识。

但更简单的方法是在应用程序运行时附加内存探查器。我使用的分析器是商业的,但Visual Studio 2013中还有一个内置的内存分析器。转到ANALYZE - >性能和诊断,并选择.NET内存分配。