是否可以完全相信記憶體回收?.Net 託管資源 非託管資源 記憶體回收 的疑問

來源:互聯網
上載者:User

CLR為開發人員提供了一個非常讓人激動的功能--記憶體回收。但是園子裡關於記憶體回收的討論,大多是討論記憶體回收的原理,以及Dispose模式。但是記憶體回收在實際使用時,是不是可以達到其設計的目標,在開發過程中有沒有需要注意的問題呢?本人也不是非常明確,這篇文章希望能達到拋磚引玉的效果,希望個人牛人能夠給本人或同樣存在疑惑的人一個清楚明確的答案。

什麼是記憶體回收?就是說你在使用CLR的時候(不包含託管資源),只需要new一個對象使用。而不需要通過程式碼進行釋放對象(以上是本人理解的記憶體回收的意義)。

託管資源非託管資源

託管資源和非託管資源的區別通常會讓開發人員弄不清楚,到底什麼是託管的,什麼不是託管的。這裡說一下自己的體會。如果你使用的Class是屬於CLR的,不管它實際上使用的什麼資源。CLR都會幫你進行記憶體回收。簡單的比如一個List對象,你使用完成(變數脫離其範圍)就會被CLR自動回收。那麼對於網上常說的資料連線,檔案類呢?其實同樣會在使用完成後被自動回收,但是因為此類資源很重要,而記憶體回收的時機不確定。所以很多教材上說此類資源需要在使用完成後及時釋放(通過程式碼)。這裡說明一點就是CLR的Class都會被自動回收,無論它實際控制的是託管資源還是非託管資源。

這裡可以做一個簡單的測試,一個WinForm項目,兩個Button(button1,button2),點擊事件如下。
privatevoidbutton1_Click(objectsender,EventArgse)
{

 FileStreamfile=newFileStream(@"c:/DisposeTest.txt",FileMode.Open);

}
privatevoidbutton2_Click(objectsender,EventArgse)
{

 GC.Collect();

}

連續點擊button1,第二次就會報錯,說明檔案沒有被釋放。但是如果點擊button1再點擊button2再點擊button1那麼就不會報錯了,因為button2記憶體回收將檔案釋放了。

那麼哪些資源,對象是不能自動回收,必須通過程式碼釋放的呢?簡單的說你使用的Class,組件不屬於CLR。比如Win32API,Com組件等。使用上述類型的時候,如果分配了資源,那麼一定要通過代碼進行釋放。還是檔案開啟的例子,如果是使用Win32API開啟檔案,那麼使用記憶體回收是沒有辦法釋放資源的。所以一定要在代碼中進行相關資源的釋放。

記憶體回收在開發中的問題

託管資源,非託管資源已經說清楚了。記憶體回收的原理這裡就不說了,網上很多文章介紹。下面我們說一下在實際開發過程中是不是可以完全相信記憶體回收,而不需要考慮對象的釋放呢?或者哪些對象是需要及時釋放的呢?本人主要是是從事WinForm開發。所以下面的討論可能是以WinForm為背景。一下是目前本人明確或者未明確的內容希望與大家討論。

1)哪些資源需要及時釋放?這個問題很明確了,資料庫連接,檔案,還有其他的大家補充吧。就想到這麼多。

2)WinForm背景下,如果建立的Form被釋放(Form=null)的時候,Form內的欄位(比如,String,DataTable,其他自訂類)是否會被自動釋放(假設這些欄位沒有被其他的地方引用)。

3)因為從事的是資料庫相關開發,自然用到最多的是ADO.Net,那麼除了Connection,其他的對象是否需要及時釋放,哪些對象是否需要及時釋放(這裡比較關心的是DataSet,DataTable)?

4)補充一點如果上述很多個物件都需要及時釋放,那麼記憶體回收的意義是不是就一定程度的降低了呢?

以上是個人對記憶體回收的理解和疑問,希望大家能夠一起討論,最後能有明確的結論。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.