Silverlight をインストールするには、ここをクリックします*
Japan変更|すべてのMicrosoft のサイト|サインイン
Visual Studio 2005
|MSDN ライブラリ|デベロッパー センター|ダウンロード情報|開発ツール製品|コミュニティ|ご意見・ご要望|サイトマップ


MSDN Home   MSDN Home
MSDN Home > Visual Studio > 旧バージョンからの移行 > VB マイグレーション Tips > オブジェクトの解放

オブジェクトの解放について

最終更新日 2005 年 7 月 7 日

サンプル コードのダウンロード (vbmigtips_ObjectDispose.exe, 90.7 KB)

プロジェクトを作成するに当たり、様々なオブジェクトを作成します。作成したオブジェクトは、解放されなければなりません。そこで今回は、Visual Basic .NET のオブジェクトの解放動作について紹介します。

Visual Basic 6.0 では、特にオブジェクトの解放を行わなくとも自動的に解放してくれました。一方、Visual Basic .NET (.NET Framework) では、使用されしなくなったオブジェクトを自動的に解放してくれるガベージコレクションという機能がサポートされています。このガベージコレクションがサポートされたことにより、オブジェクトの解放を明示的に行う必要は、基本的にありません。

今回は、ボタンを選択するとオブジェクトを生成するプロジェクトを実行した場合を例にして紹介します。オブジェクトを生成する実装コードは以下のとおりです。

Private a() As String

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
a = New String(1000000) {}
End Sub
リスト1

今回は、ガベージコレクションが実行されたか否かを確認するため、パフォーマンスにて確認します。[コントロールパネル]の[管理ツール]から[パフォーマンス]を開きます。「+ (追加) 」ボタンを選択し、[カウントの追加]ダイアログを開きます。表示されたダイアログで、[パフォーマンス オブジェクト]コンボボックスより「Process」を選択し、[カウント]リストボックスから「Private Byts」を、[インスタンス]リストボックスからリスト1 のコードを実装したプロジェクトのアプリケーションを選択します。そして、[追加]ボタンを選択します。これにより、指定したアプリケーションが実行されたときのメモリ量を測ることができます。図1 はリスト1 を実装し、プロジェクトを実行したときのものです。

 
 図1

リスト1 のプロジェクトを実行し、[生成]ボタンを選択すると、変数 a が生成されます。このとき、メモリ量は増加します (図1 の 1)。ここで、[生成]ボタンを数回選択すると、次々に変数 a が生成され、メモリ量が次々に増加します。しかし、ある地点でメモリ量が減少する場所 (図1 の 2) があります。この、メモリ量が減る地点でガベージコレクションが行われています。

このように、ガベージコレクションは、.NET Framework が任意のタイミングで随時実行されます。そのため、オブジェクトは自動的に解放され、使用されなくなったメモリを自動的に回収してくれるので、メモリの不足を気にする必要はありません。しかし、意図的にオブジェクトを解放したいときもあると思います。たとえば、大きいプログラムを作成する場合、ガベージコレクションが発動されるまでの間、一時的にメモリが大量に消費される場合があります。そこで続いては、意図的にオブジェクトを解放する方法について紹介します。

意図的にオブジェクトの解放を行う場合、各オブジェクトがサポートしている Dispose メソッドや Close メソッドなどを使用したり、オブジェクトに「Nothing」を代入したりします。今回は、リスト1 で生成したオブジェクトを解放するため、変数 a に「Nothing」を代入します。実装コードは以下のとおりです。

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
a = Nothing
End Sub
リスト2

リスト2 を実装し、[解放]ボタンを選択すると、変数 a に「Nothing」が代入されます。しかし、ここで、パフォーマンスのメモリの状態を確認するとメモリが減っていないことがわかります。.NET Framework では、変数に Nothing を追加してもメモリはすぐに解放されるわけではありません。この時点では、あくまでも変数 a がガベージコレクションの対象となっただけにすぎないのです (図2)。

 
 図2

そこで、続いて、ガベージコレクションを意図的に実行する方法についてご紹介いたします。.NET Framework には、System.GC クラスに Collect というメソッドが用意されています。Collect メソッドを実行することで、ガベージコレクションが発動し、不必要なオブジェクトを強制的に解放することができます。下記のコードの太字をリスト2 に追加します。

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
a = Nothing
GC.Collect()
End Sub
リスト3

リスト3 を実装し、プロジェクトを実行します。[生成]ボタンによって複数回、変数 a を生成後、[解放]ボタンを選択すると、ガベージコレクションが実行されオブジェクトが解放されます。これにより、変数 a が解放されメモリが減少します (図3)。

 
 図3

このように、System.GC クラスの Collect メソッドを使用することで、意図的にガベージコレクションを実行することができ、オブジェクトの解放と使用しなくなったメモリの回収を制御することができます。しかし、あくまで、ガベージコレクションは、.NET Framewrok が必要と判断したときに随時実行されるため、すべてのメモリを制御しようとするべきではありません。その理由の一つとして、ガベージコレクションは、非常に負荷がかかります。そのため、常にガベージコレクションを実行するようなコードにすると、アプリケーションのパフォーマンスに影響を与える可能性があります。大きいオブジェクトの使用が終わったときなど、特定の状況で使用された方が良いでしょう。


Microsoft