2010-03-02 41 views
1

WPF內存泄漏問題。內存穩定,小文件,但增長,直到大文件的OOM例外。WPF內存泄漏,但僅當文檔總佔用空間超過閾值時

背景:

我們已經開發出用於控制動態顯示的WPF應用程序。有一個「設計」組件,用戶在其中放置顯示文檔和一個文檔「顯示」組件。

顯示中的元素可以包含文本和/或圖形。每個元素可以通過不同的字符串或圖像使用各種過渡週期 - 滾動,衰落,閃爍等

問題:

問題是與顯示圖形元素,以不同的圖形之間的交叉衰落。淡入淡出是通過動畫兩個WPF圖像控件(一個用於傳入,一個用於傳出)的不透明屬性來完成的。

一切,只要能正常工作的應用程序的總內存佔用,同時運行低於(尚未準確定義)閾值。當總佔地面積增加時(例如,通過添加另一個具有大圖形的圖形元素),那麼應用程序使用的總內存開始增加,並且最終呈現出OOM異常。大型圖形本身或衰落圖形本身沒有內存泄漏問題,但只有組合。

有沒有其他人看過類似的行爲?任何解決方案的想法?我猜測這個問題與大對象堆碎片有關,但這只是一個猜測。

不幸的是,我沒有示例代碼後,因爲這是一個更大的解決方案的一部分。我將嘗試創建一個示例應用程序來說明這種行爲並更新我的帖子。

回答

0

爲了正確診斷,您可以在崩潰點之前或之前從一個小型轉儲開始,並使用合適的調試程序(WinDbg with SOS,對我來說)來確定發生了什麼。在Win7中(不是在XP中,對Vista沒有把握),你可以通過右鍵單擊任務管理器中的應用程序/進程並選擇適當的選項來生成小型轉儲。

如果它不是大對象堆,那麼它可能與GC有關。假設有一個關聯類的開銷與你添加的每個元素有關嗎?是否有很多臨時類正在創建(比如,在每個顯示器上)?這可能是由於內存壓力導致GC將大量對象推入Gen1和/或Gen2,這增加了內存壓力。

SOS/WinDbg命令「!eeheap -gc」將打印您的GC代的大小,這可能會告訴您Gen2隨着您的應用程序數據的增加而增加。