CSharp - C# OpenXML内存泄漏

  显示原文与译文双语对照的内容
71 2

我注意到应用程序中的内存泄漏,并试图找出它。我不知道( 任何建议)的内存泄漏发现技术,因这里我将它简单的插入内存使用打印( 带或者不带 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:tmpa.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不可理解。Using使用"甚至独立块 {},它们本身应该完全干净。而他们没有更糟糕的是。这个例子是简化的。在实际上,当我在我的方法内执行这个代码时。在这个例子中,它是 90 K 。100个文档后,它是 9 Mb 。

通过描述方法,当调用GC时,我的应用程序中也发现很少的地方,并且不返回内存。每次调用GC的唯一结果是 4K 内存消失。不幸的是,我不能用简单的例子重现它。

到目前为止,我只找到一个解决方案- 当内存变得关键时,我重启应用程序。solution好的解决方案,但我找不到更好的。

时间:原作者:0个回答

145 3

如果我们坚持自由或者者在生产环境中,我将使用 ADPlus 创建内存转储和 WinDbg 分析它。你可以围绕着谷歌,在这个主题上有很多知识。

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

原作者:
...