2011-01-25 35 views
2

我有一個標準的CRUD應用程序,可以處理大量的數據。不同的窗口使用Linq-To-SQL訪問不同的表格,並且每個窗口基本上都有一個網格,單元格綁定到我正在顯示的對象上。爲什麼我的窗戶沒有被垃圾收集?

這裏發生的事情的一個非常標準的用例:

  1. 打開窗口一
  2. 關閉窗口A - 窗口A現在仍然在內存中,但不再可見。
  3. 打開窗口B
  4. 關閉窗口B - Windows A和B現在都在內存中,都不可見。
  5. 打開窗口C
  6. 當窗口C的數據被檢索時,窗口A的資源被釋放。

因此,在任何給定的時間,我有2-3個窗口在內存中,當我真正擁有的只有一個。我甚至爲這些窗口的關閉事件添加了處理代碼,這些窗口將所有我能想到的引用設置爲null。

我試過使用ANTS內存分析器,並且我注意到每個窗口都設置爲GC根。有沒有辦法禁用這種行爲或以某種方式強制GC從這些窗口收集?

謝謝!

PS:我檢查了this link並且它沒有解決問題。

編輯:問題是,用戶正在獲取System.OutOfMemoryExceptions。

回答

2

我能夠解決這兩個更新。首先,我在孩子的窗戶上使用Telerik控件。 Telerik控件必須跟蹤根視覺,因此如果它們僅在子窗口上實例化,那麼在每個實例化時,它們都假定子窗口是根視覺,併爲其分配一個靜態引用。通過在我的主應用程序窗口上實例化一個telerik控件,該窗口被設置爲靜態引用中的根視覺。

我做的第二個更新是將每個子窗口的所有者作爲我的主應用程序窗口。在完成這個和分析後,我發現子窗口不再被設置爲GC根。

現在我的子窗口在關閉後會自動收集垃圾,一旦新的內存請求另一個窗口。

2

通常GC有他自己的生活。通過釋放資源,您只需通知它不再需要資源。由於性能限制和平臺特定的實現,垃圾收集需要一些時間。

什麼讓開發人員更輕鬆 - 有時會傷害到性能。這就是爲什麼在C/C++ 可以擁有你想要的內存和新/刪除。甚至有那裏有池和其他技術,導致新/刪除不便宜。

最後,您需要確定架構中的問題。爲什麼這是你的問題?從內存中解脫出來?交換?本地或在服務器上?等

+0

「通常GC有他自己的生活。「 - 即使當我調用GC.Collect()時,它也不會釋放資源,就好像某些東西正在持有這些資源,但我不知道可以做什麼,我沒有任何靜態引用這些應該收集的對象 - 我已經用探查器驗證了這一點,我假設這個問題與每個窗口都是GC根有關,但我不知道該怎麼做,因爲它似乎內置於WPF – Jake 2011-01-25 02:19:38