簡體   English   中英

C#OpenXML內存泄漏

[英]C# OpenXML memory leak

我注意到應用程序內存泄漏,並試圖找出原因。 我不知道好的和免費的內存泄漏發現技術(有什么建議嗎?),所以我很簡單-插入內存使用情況打印(帶有和不帶有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內存消失的唯一結果。 不幸的是,我無法在簡單的示例中復制它。

到目前為止,我只找到了一種解決方案-當內存變得至關重要時,我重新啟動了應用程序。 不是很好的解決方案,但我找不到更好的解決方案。

好吧,如果我們堅持免費使用或處於生產環境中,我將使用ADPlus創建內存轉儲,並使用WinDbg對其進行分析。 您可以在Google周圍找到有關該主題的大量知識。

但是更簡單的方法是在應用程序運行時附加內存分析器。 我使用的探查器是商用的,但Visual Studio 2013中還有一個內置的內存探查器。轉到ANALYZE-> Performance and Diagnostics並選擇.NET內存分配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM