![](/img/trans.png)
[英]How to make Garbage collector dispose a collection before it goes out of scope?
[英]How to dispose DataTable in asp.net before garbage collection by the GC?
我的應用程序24X7工作,我使用DataTable進行數據處理。
我每次都需要處理DataTable。 我使用了Dispose和Clear方法,但是當我調試代碼時,內容只被清除,其實例仍在內存中。
如何在不依賴GC的情況下將其從內存中刪除?
提前致謝..
編輯:這是我的代碼原型。 我是以兩種方式完成的。
1 //Methord 1
2 while (true)
3 {
4 DataTable dt = new DataTable();
5 dt.Columns.Add("City", typeof(string));
6 dt.Rows.Add("ABC");
7 dt.Rows.Add("XYZ");
8 dt.Rows.Add("PQR");
9 dt.Rows.Add("LMN");
10 dt.Dispose();
11 }
12 //Methord 2
13 while (true)
14 {
15 using (DataTable dtable = new DataTable())
16 {
17 dtable.Columns.Add("City", typeof(string));
18 dtable.Rows.Add("ABC");
19 dtable.Rows.Add("XYZ");
20 dtable.Rows.Add("PQR");
21 dtable.Rows.Add("LMN");
22 }
23 }
數據表如何處理? 如果你用斷點檢查,你可以看到數據表'dt'在調用dispose()后仍然有值。即使執行第11行仍然存在值。我需要在執行第12行之前釋放該內存(或之前)第二次迭代)。 我該怎么辦?
如果將對數據表的每個引用都設置為nothing / null,則可以對基礎數據進行垃圾回收。 當一個對象成為孤兒時,dotnet框架會在感覺合適時自動進行垃圾收集。
您可以告訴垃圾收集器手動收集,但它只會收集代碼中沒有引用的對象。 http://msdn.microsoft.com/en-us/library/xe0c2357.aspx
關於dotnet GC如何工作的總結。 http://dotnetfacts.blogspot.com/2008/05/how-garbage-collector-works-part-1.html
如果垃圾收集器沒有釋放內存,可能是因為您可能編寫的其他對象,Ui控件/其他業務對象引用了數據表中的行數據。 例如,您正在顯示行數據,或者您已將行傳遞到另一個對象,並且它具有對此行的引用。
如果您的內存不斷增加,則會出現內存泄漏,即您有越來越多的對象引用它們,並且框架無法收集此數據,因為它認為它正在被使用。 您將需要查看您的代碼並嘗試找出它泄漏的原因,內存分析器可能會有所幫助。
如果不依賴GC,則無法將其從內存中刪除。 它將取決於GC何時以及如何釋放內存。 GC以不確定的方式工作,這意味着您無法確定GC何時實際釋放實例
您應該確保在不再需要DataTable時不要保留任何參考。 如果您已正確完成該部分,即除非有必要,否則沒有對DataTable的引用,那么您就是好的並且在GC上保持休息狀態
我懷疑嘗試重建GC無論如何都是一個很好的設計。 為什么不運行一個24/7運行的循環任務,只是將Process作為一個新線程啟動? 線程完成后你可以銷毀它,結果你沒有內存問題。
垃圾收集將需要完全處理它,但如果您不再需要它,您可以始終將其設置為null。
//do some stuff with the table
//don't need it any longer so set it null
table = null;
您可以始終將數據表本身包裝在using塊中,而不是調用dispose方法:
using (DataTable dt = new DataTable())
{
//Do work here
}
這可以確保在對象本身超出其范圍時清除它。
MSDN文章本身是一個顯而易見的資源,如果您之前從未使用它,但這個想法非常簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.