稱之為入門篇,因為他寫的真的很好懂,以下實 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 是有其必要性。
沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。