2015-10-15 137 views
2

我正在解決用作集成服務的Windows服務中的內存泄漏問題。檢測內存泄漏使用PerfView

通過「doIntegration()」調用,我可以看到內存使用量比調用前高,並且每次調用大約增加0.5 MB。

我曾嘗試使用PerfView來查找內存泄漏的位置。

故障處理方法:

1)第一doIntegraion呼叫

2)取堆快照doIntegration呼叫

3)做前後取堆快照步驟2多次

4 )檢查每個呼叫的方法/組變得更高

5)在單獨的快照上使用diff來定位哪裏e內存泄露是

我可以看到LIB mscorlib!RuntypeType是每次都會變高的方法/組。當我嘗試檢查什麼是指它,我得到

  • 已固定處理
    • .NET根
      • ROOT

而且我不能更多地展開樹。

當我選擇視圖時,RefTree可以看到更多的東西。

  • ROOT 100%
    • .NET ROOT 100%
      • 已固定手柄70.6%
        • LIB mscorlib程序!RuntimeType 46%
        • LIB mscorlib程序!反射.... 13.4% ...
      • 靜態乏30.7%
        • ns.ConfigurationSettings 5​​9.5%
        • ns.Leaks.ConfigurationSettings -33。3%

我已經做一個diff在幾個快照,以及唯一的方法/組遞增是被釘扎手柄和它們僅指MSCORLIB類型。

有沒有其他人有這種問題?

我認爲這個問題可能是使用XMLSerializer從Model到XML的序列化,但我不太確定。

有沒有人知道另一種方法來嘗試找到內存泄漏?

謝謝:)

+0

看看這些對象創建的堆棧軌跡,可能會提示你這些對象是什麼。 –

+0

謝謝!我試圖追蹤它,因爲我認爲這是由於序列化。序列化程序使用創建臨時程序集的構造器打開,顯然該程序集不在GC法律範圍內。因此,每次調用dointegration時,都會創建幾個臨時組件。 – Alex

回答

1

答案很晚。但我認爲這是序列化程序增加了每個「doWork」的內存使用量。

XmlSerializer有一些「討厭」的構造函數,它們實際上會在每個init中創建一個臨時程序集,並且它們不會被GC收集。

我緩存了不同的XmlSerializer,這些XmlSerializer使用了一個令人討厭的構造函數,因此temp程序集只創建一次。

現在沒有任何內存泄漏。