iT邦幫忙

0

[C#] 問一下List的記憶體釋放

小魚 2017-12-24 08:04:4522063 瀏覽

小弟因為最近需要寫會用到大量記憶體的程式,去查了一下MSDN上面的說明

參考資料
Clear
Capacity
TrimExpress

其實MSDN的說明很多都看不大懂,
我的問題是,
Clear似乎是不會影響到Capacity,
但是那個記憶體有關係嗎?
Clear就會釋放掉記憶體了嗎?
還是Clear之後還要加上TrimExpress才會釋放掉記憶體,
要麻煩知道的大大指點一下迷津
感恩~
/images/emoticon/emoticon41.gif/images/emoticon/emoticon41.gif/images/emoticon/emoticon41.gif

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

3
John Wu
iT邦新手 4 級 ‧ 2017-12-24 10:52:11
最佳解答

Clear() 後 item 就等 GC 處理了,List 本身不會釋放;有沒有加 TrimExcess() 對釋放記憶體沒幫助。
如果要釋放 List,建議用 Dispose() 然後指派成 null。

Sample

var list = new List<XXX>();
// ...
list.Dispose();
list = null;
小魚 iT邦大師 1 級 ‧ 2017-12-29 11:56:43 檢舉

附帶一提,我試過
list.Dispose()沒這種用法
list = null;可以
網路上有寫如果不自己另外寫方法,
用list = null是比較簡單的方式.

John Wu iT邦新手 4 級 ‧ 2017-12-29 14:23:59 檢舉

抱歉,我的失誤,List 沒有繼承 IDisposable

0
Sean Liao
iT邦新手 5 級 ‧ 2017-12-31 00:32:08

呼叫 Clear() 後,List 裡的 Item 會被清空(非回收);如果 List 裡放的是參考型別,就僅僅是將 List 裡儲存的參考設定為 null,此時 List 所佔用的記憶體空間仍在。而若被清空的 Item 在程式的其他地方沒有被參考,就會在下一次 GC 被回收。

將 List 設定為 null 並不代表 List 的 Item 指向的物件在 heap 中佔用的記憶體會被 GC 回收,還是要看原先儲存在 List 中的 Item 指向的物件是否有被其他人參考到(這裡假設 Item 為參考型別)。也就是說,將 List 設定為 null 只確保了儲存在 List 中的 Item 參考位置(指標)會在下一次 GC 回收。

小魚 iT邦大師 1 級 ‧ 2017-12-31 07:44:01 檢舉

我的問題重點就是,
所謂的"下一次GC"是什麼時後,
多久之後他會回收,
然後下一個問題,
如果我設了null,
然後又new一個新的出來,
那之前那部分會回收嗎?
我要如何測試知道有沒有被回收??

Sean Liao iT邦新手 5 級 ‧ 2018-01-03 13:35:05 檢舉
  1. 時間點由 CLR 決定,可呼叫 GC.Collect() 強制執行記憶體回收(將沒有根參考的物件回收、壓縮記憶體)。
  2. 同 1.,可以觀察 GC.CollectionCount(int generation) 取得 GC.CollectionCount(int gen) 各 generation GC Collect 執行次數;或是觀察程序所佔用的記憶體。

參考資料:
https://msdn.microsoft.com/en-us/library/system.gc.collect%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

小魚 iT邦大師 1 級 ‧ 2018-01-03 19:33:24 檢舉

kalaja
感恩,
我來研究看看~
/images/emoticon/emoticon33.gif

我要發表回答

立即登入回答