2013-01-10 21 views
0

我們正在開發使用Prism 4的WPF應用程序,並且由於資源未被釋放而正在經歷嚴重的內存泄漏。我們使用ANTS Memory Profiler來檢測哪些類阻止了垃圾收集器釋放內存,但我們對這個工具非常陌生,所以我們對其輸出的理解是有限的。無法使用ANTS RedGate Memory Profiler解決內存泄漏

我們的測試案例在於打開一個窗口,讓您從列表中選擇一個插件。該窗口託管一個Wizard控件,該控件包含一個標題,一組按鈕和一個顯示活動WizardPage(即UserControl)的主區域。通過選擇插件並單擊下一步按鈕,更多的WizardPage控件在嚮導區域中註冊並使用RegionAdapter添加到Wizard.Pages集合中。用戶可以通過點擊Next/Previous按鈕來瀏覽頁面。 如果我們打開向導窗口,只需單擊取消按鈕,則會按預期方式調用嚮導控件終結器。但是,如果我們在單擊「取消」按鈕之前打開向導窗口並展開插件組合框,則永遠不會調用嚮導控件終結器。這裏是Instance分類程序爲嚮導的螞蟻內存分析器截圖:

Instance Categorizer

我們嘗試沒有成功,幾乎一切,可能有人幫助我們理解這是怎麼回事呢?

預先感謝您。

+0

而不是張貼截圖的圖像,如何張貼實際的消息?我根本看不懂。 – Joe

+0

@Joe:請在新標籤中打開圖片(查看圖片,在另一個標籤中打開圖片或類似內容)。此時,您將可以縮放並查看實際大小的圖像。 –

+0

你不能關閉你的ImportWizardWindow嗎?這看起來像是你擁有的唯一真正的類。配置窗口,你應該沒問題。但從截圖中的數字來看,無處不在1,所以這可能不是真正的問題,螞蟻的分析是虛假的。 –

回答

2

如果你剛開始接觸ANTS Memory Profiler,你可能會發現它最有用的通過看類列表而不是實例分類開始。

一個好方法可能是在點擊應用程序中的下一步按鈕之前拍攝基線快照。然後打開向導窗口並展開插件組合框,然後單擊取消。此時,在ANTS中拍攝另一個內存快照,並比較兩者。如果您進入班級列表,您可能會看到現在存在於內存中的WizardPage類的一個實例,該實例以前不存在且應該已刪除。選擇,然後在螞蟻去實例列表

選擇WizardPage實例,然後單擊以查看實例保留圖,該圖顯示引用鏈回到內存中保存該特定實例的GC根。

通過回顧那些引用鏈,你應該能夠確定哪些鏈接存在應該被打破,以便從內存中釋放對象。