Visual Basic .NETにおけるガーベジコレクション(Garbage Collection、GC)は、自動的なメモリ管理プロセスであり、未使用のオブジェクトを解放し、メモリリークを防ぎます。オブジェクトを作成すると、管理されたヒープにメモリが割り当てられ、オブジェクトへの参照がなくなると、GCが時間とともに占有されていたリソースを解放します。
特長:
Finalizeメソッドを実装できますが、IDisposableインターフェイスとDisposeメソッドを使用する方が信頼性が高いです。Disposeメソッドを呼び出すためにUsing構文を使用してください。Disposeを使用したコードの例:
Public Class FileManager Implements IDisposable Private disposed As Boolean = False ' ... 非管理リソース Public Sub Dispose() Implements IDisposable.Dispose If Not disposed Then ' リソースのクリーンアップ disposed = True End If GC.SuppressFinalize(Me) End Sub Protected Overrides Sub Finalize() Dispose() MyBase.Finalize() End Sub End Class
プログラム終了時にオブジェクトのファイナライザが呼び出されることが保証されますか?
誤った回答: はい、オブジェクトが不要になったときにファイナライザは自動的に呼び出されます。
正しい回答: いいえ、プロセスが終了する際にファイナライザが呼び出されることは保証されません。ファイナライザはGCが処理できた場合にのみ呼び出されます。リソースを確実に解放するために、常にDisposeを使用してください。
例:
' リソースの確実な解放のためにUsing構文を使用 Using mgr As New FileManager() ' リソースの操作 End Using
物語
ファイル処理プロジェクトでは、一時ファイルがファイナライザのみに依存して削除されませんでした。ファイルが大量にある場合、Disposeを明示的に呼び出すまで、ファイルシステムがオーバーフローすることがありました。
物語
開発者は、各操作後に手動でGC.Collect()を呼び出していました — これによりアプリケーションのパフォーマンスが大幅に低下し、頻繁なガーベジコレクションが多くのCPUを消費しました。
物語
大規模なWebアプリケーションでは、サービスの一つがDisposeパターンを誤って実装し、GC.SuppressFinalize()を呼ばなかったため、オブジェクトの二重クリーンアップが行われ、予期しないクラッシュやリソースリークが発生しました。