2017-02-03 67 views
-1

我正在努力解決內存問題,我可以確定地看到它,但我不知道它發生的時間和地點。調試內存泄漏VS2015。大規模原生堆

我的託管堆大小似乎沒問題(100MB),但本機堆大小在未知時刻開始增長,直到它達到〜2GB並且應用崩潰爲止。

我的應用程序正在運行很多線程,並且它在許多循環中通過EF 6執行大量的Db連接。 這就是爲什麼我很難通過查看日誌或放置斷點來調試代碼。

我想也許我可以通過查看內存來了解問題所在,但只有我能看到的是,我的本地堆大小主要由大小爲8,192字節的對象填充。所以我可以看到問題真的發生了,但仍然不知道爲什麼。

我不確定我是否正在使用Visual Studio內存分析器的100%功能。
我現在可以看到的是: Snapshot of Native Heap

我還能做以上怎麼找到這個問題?

也許這是一個愚蠢的問題,但我正在解決這個問題兩天,我幾乎達到了我的想法限制。

我已經通過斷點,日誌,代碼分析,但我仍然沒有任何線索。

我將不勝感激任何想法。

[編輯] 15:11 2017年2月3日

我能找到負責對泄漏的代碼,但它仍然有沒有意義對我來說。這段代碼如何導致大量內存泄漏?

的代碼是:

public class DbData : IDisposable 
{ 
    private DBEntity db; 

    public DbData() 
    { 
     db = new FruitDBEntity(); 
    } 

    public Fruit AddFruitDefinition(Fruit fruit) 
    { 
     lock (thisLock) 
     { 
      var newFruit = db.Fruits.Where(f => f.FruitId  == fruit.FruitId) 
            .Where(f => f.FruitName == fruit.FruitName) 
            .Where(f => f.FruitColor == fruit.FruitColor) 
            .FirstOrDefault(); 
      if (newFruit == null) 
      { 
       newFruit = db.Fruits.Add(fruit); 
       db.SaveChanges(); 
      } 
      return newFruit; 
     } 
    } 
} 

DbData創建我想使用方法AddFruitDefinition()每次:

using (var data = new DbData()) 
{ 
    data.AddFruitDefinition(); 
} 
+1

你可以嘗試註釋掉一些您的循環(假的數據,如果必要的話)來嘗試的引起該問題的代碼部分隔離開來。也許你不會正確處理一些數據庫對象.... –

+0

如果你知道調試診斷,它的泄漏跟蹤功能可以很容易地知道哪個本地庫負責本地泄漏。 –

+0

@RenéVogt:我能夠找到這段代碼。但這看起來很正常。我不知道這裏可能會導致什麼問題。 – Wiktor

回答

1

首先,你需要至少兩個快照。 據我所知(從圖像)你只有一個快照。

怎麼辦?

  1. 用分析器啓動應用程序。

  2. 完成常規步驟並拍攝快照。

  3. 重複您在步驟2中完成的相同步驟,並拍攝另一張快照。
  4. 停止申請。您應該看到2個快照,單擊2ns快照並選擇比較#Snapshot 1. 處理結果可能需要一些時間。
  5. 您應該能夠在報告中看到幾個額外的列(標識符,計數,大小,模塊,計數差異大小差異 最後兩列很重要。他們告訴哪個班第二次使用更多/更少的記憶。

總結...你需要弄清楚內存泄漏的位置並修復它。你會通過比較快照來做到這一點。

enter image description here

+0

謝謝! 正如你所說,現在我可以檢查這兩個快照之間的差異,但不幸的是,我將這些差異看作是「未解決的分配」。 沒有任何參考。 我找不到有關「未解決的分配」的任何內容。 – Wiktor