稱之為入門篇,因為他寫的真的很好懂,以下實 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
整個過程如同程式流程一樣:
- 取得目前 GC 層數
- 新增一物件,並顯示此物件目前所在 GC 層數
- 進行 GC 回收,因為每次 GC回收 obj物件沒有消失,代表重要性需要提升,加高一層級
- 設定 obj 為 Nothing
- 執行 GC 回收,GC 發現 obj 為 Nothing,回收此資源
此篇說明比較學術,但可以更細部了解整個 GC 運作,真的是大內高手專欄。
個人心得
我覺的看完第一篇就很有滿足感,就我在 Web Developer 的工作內容上,我們一般只用用 Close 或 Dispose ,很少會去手動碰 GC 的內容。不過,能更深一層的了解 .NET Framework 是有其必要性。
沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。