2012-03-23 30 views
0

我定義如下一類的一些全局變量:vb.net爲什麼在表單關閉後,類成員仍然佔用內存?

Private Class MyClass 
Private var1 as Decimal 
Private list1 as List(Of string) 
Private list2 as List(Of string) 
....'Subs here 
End Class 

但是我發現,這種形式被關閉後,上述所有變量var1,列表1,列表2仍然存在於內存中。我認爲他們應該由gc收集,因爲表格已經按我確認的方式處理了。

添加:我在表格關閉後半小時內進行了監控。但這些變量不是由gc收集的。我使用上述變量的表單上有一個自動更新過程。由於上述變量仍然保持值,所以始終調用自動更新過程,從而導致異常。 (一個快速的解決辦法是檢查是否form.isDisposed在更新過程。但我不認爲這是elegeant。此外,這些變量佔用內存。)

感謝

+0

處置並不意味着會立即GC'ed並從內存中刪除。 – vcsjones 2012-03-23 16:22:20

+0

垃圾收集並不總是立即發生,所以事情可能會一直存在,直到GC運行。如果這些變量未在其他地方引用,則可能會標記並在下一次運行中清除。 – 2012-03-23 16:24:38

+0

推薦閱讀:[每個人都認爲垃圾收集是錯誤的](http://blogs.msdn.com/b/oldnewthing/archive/2010/08/09/10047586.aspx)。 – delnan 2012-03-23 16:29:48

回答

-1

但是我發現在這個表單關閉之後,上面所有的變量var1,list1,list2仍然存在於內存中。

這是預期的行爲;垃圾收集是非確定性的,這意味着您無法準確預測對象聲稱的內存何時將被回收。垃圾收集是一個昂貴的過程,並且該算法足夠智能,可以將其延遲到絕對必要時(即,當您需要內存時)。

我認爲他們應該由gc收集,因爲表格已經按我確認的方式處理了。

,除非你調用Dispose方法明確,或包裹在using聲明其創作的形式沒有得到處置。但是這仍然不能「解決」你引用的問題,因爲即使對象被丟棄,其成員使用的內存也不會立即回收。處置需要發佈非託管資源;你在這裏談論管理的。

我不完全清楚你想要解決的實際問題。你的電腦內存不足?當您嘗試在代碼中創建新對象時,是否發生內存不足錯誤?如果沒有,你爲什麼如此擔心你的物品何時被釋放?這就是垃圾收集環境的要點:讓你不必擔心這些事情。

我也不確定你用什麼工具來檢查存儲在這些內存位置的數據,但是如果它是Visual Studio調試器,你會得到錯誤的信息。在調試器下運行時,對象的生命週期實際上會延長,以便您可以檢查它們的值。

+0

我正在使用Visual Studio調試器。我使用上述變量的表單上有一個自動更新過程。由於上述變量在表單關閉後仍然保留值,所以始終會調用自動更新過程,從而導致異常。 (一個簡單的解決方法是檢查form.isDisposed是否在更新過程中,但我認爲這不是最重要的,此外,這些變量佔用內存。) – Summer 2012-03-23 18:00:33

+0

@Summer:好的,您的自動更新過程如何工作?它檢查哨兵值嗎?只需在表單處理完畢後設置這些值。 – 2012-03-23 20:31:24

+0

自動更新過程檢查我在問題中定義的全局變量,例如var1,list1。你的意思是說我在設計器中將這些值設置爲Dispose?或者我可以簡單地檢查是否form.isDisposed在自動更新程序中? – Summer 2012-03-23 20:50:22

2

使用垃圾收集暗示着垃圾。這就是你所看到的。

對引用進行計數的內存管理系統可以在不再引用對象時立即刪除對象,但這也意味着當時刪除它們的成本就來了。

在使用垃圾收集的系統中,該成本以特定的時間間隔進行,並且每個對象的成本較低,因爲它一次除去大量對象。在垃圾收集之間,未使用的對象保留在內存中。

此外,並非每個垃圾收集都會刪除每個未使用的對象。垃圾收集有不同的級別,其中最常見的只收集未使用的短期對象。

相關問題