網頁

.NET Framework 垃圾收集(garbage collection)初了解

感謝 91哥提供的兩篇文章,讓我更加了解垃圾收集 (garbage collection,GC),看完感覺,越自動化感覺不到它的存在越是重要


稱之為入門篇,因為他寫的真的很好懂,以下實 C# 轉 VB,再加上自己的一些註解。

Module Module1

    Private Sub GenerationDemo()
        ' 了解 GC 最大為 0, 1, 2 三層
        Console.WriteLine("最大 GC 代: {0} ", GC.MaxGeneration)

        ' Heap 新增一物件
        Dim obj As New GenObj("Generation")

        ' 顯示目前物件在 GC 第幾層
        obj.DisplayGeneration()

        For i As Integer = 1 To GC.MaxGeneration
            ' 進行 GC 收集動作
            GC.Collect()
            ' 因為 obj 沒被回收
            ' 每次會被拉高一層代
            obj.DisplayGeneration()
        Next

        obj = Nothing

        For i As Integer = 0 To GC.MaxGeneration
            ' 強制立即執行層代零至指定層代的記憶體回收。
            GC.Collect(i)
            ' 暫止目前的執行緒,直到處理完成項佇列的執行緒已經清空該佇列為止。
            GC.WaitForPendingFinalizers()
        Next

        Console.WriteLine("Demo Stop.")
    End Sub

    Sub Main()
        GenerationDemo()
        Console.ReadLine()
    End Sub

End Module

Class GenObj
    Private _name As String

    Sub New(name As String)
        name = _name
    End Sub

    ' 回傳目前物件所在 GC 第幾層
    Sub DisplayGeneration()
        Console.WriteLine("我在第 {0} 層", GC.GetGeneration(Me))
    End Sub
End Class

整個過程如同程式流程一樣:
  1. 取得目前 GC 層數
  2. 新增一物件,並顯示此物件目前所在 GC 層數
  3. 進行 GC 回收,因為每次 GC回收 obj物件沒有消失,代表重要性需要提升,加高一層級
  4. 設定 obj 為 Nothing
  5. 執行 GC 回收,GC 發現 obj 為 Nothing,回收此資源

此篇說明比較學術,但可以更細部了解整個 GC 運作,真的是大內高手專欄。

個人心得

我覺的看完第一篇就很有滿足感,就我在 Web Developer 的工作內容上,我們一般只用用 Close 或 Dispose ,很少會去手動碰 GC 的內容。不過,能更深一層的了解 .NET Framework 是有其必要性。

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。