ProgrammingVB.NET開発者

Visual Basic .NETにおけるガーベジコレクション(Garbage Collection)とは何か、オブジェクトのファイナライゼーションはどのように機能し、メモリ管理において注意すべき点は何か?

Hintsage AIアシスタントで面接を突破

回答

Visual Basic .NETにおけるガーベジコレクション(Garbage Collection、GC)は、自動的なメモリ管理プロセスであり、未使用のオブジェクトを解放し、メモリリークを防ぎます。オブジェクトを作成すると、管理されたヒープにメモリが割り当てられ、オブジェクトへの参照がなくなると、GCが時間とともに占有されていたリソースを解放します。

特長:

  • 手動でGCを呼び出すことは通常推奨されず、.NET環境に制御を委ねるべきです。
  • クラスは非管理リソースをクリーンアップするためにFinalizeメソッドを実装できますが、IDisposableインターフェイスとDisposeメソッドを使用する方が信頼性が高いです。
  • 自動的にDisposeメソッドを呼び出すためにUsing構文を使用してください。
  • ファイナライザは、参照を失った直後に実行されるのではなく、GCが必要と判断したときに実行されます。

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()を呼ばなかったため、オブジェクトの二重クリーンアップが行われ、予期しないクラッシュやリソースリークが発生しました。