加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#OpenXML内存泄漏

发布时间:2020-12-16 07:12:09 所属栏目:百科 来源:网络整理
导读:我注意到我的应用程序中存在内存泄漏并试图找出它.我不知道好的和免费的内存泄漏发现技术(任何建议?)所以我简单 – 插入内存??使用打印(有和没有GC),然后深入挖掘最大的泄漏.可修复我已修复但有些我不能,因为它们在内部包.像这个非常简化的那个 using Syste
我注意到我的应用程序中存在内存泄漏并试图找出它.我不知道好的和免费的内存泄漏发现技术(任何建议?)所以我简单 – 插入内存??使用打印(有和没有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,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,Thread.CurrentThread.CurrentCulture));
            Console.WriteLine("End");
            Console.WriteLine("3) " + System.GC.GetTotalMemory(true).ToString("000,Thread.CurrentThread.CurrentCulture));
        }
    }
}

通常它产生类似的东西

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

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

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

通过描述的方法,我在调用GC消耗时在我的应用程序中找到了很少的位置并且没有返回内存.每次调用GC时,4K内存消失的唯一结果.不幸的是,我无法在简单的例子中重现它.

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

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读