DataSet
/を使用し、DataTable
後で適切にクリーンアップする最良の方法を見つけようとしています。
メモリが解放される原因については、少し困惑しています。DataTable
ループ内で同じものを複数回入力するテスト アプリケーションで理論をテストし、 3 回の強制 GC 収集後のメモリ フットプリントについて Windows のタスク マネージャーを調べました。
私が見つけたのは次のとおりです。
Clear
またはを呼び出さなかった場合、または変数をにDispose
設定しなかった場合、タスク マネージャーでの最終的なメモリ消費量は約 30k でした。DataTable
Nothing
変数を
Nothing
ループ内に設定した場合、最終的なメモリは約 15k でした。
質問: 変数を設定するNothing
と違いが生じるのはなぜですか?Dispose
ループ内のメソッドだけを呼び出した場合、最終的なメモリは約 19k でした。ループ内でのみ呼び出した場合
Clear
、最終的なメモリは約 16.5k でした。実際、その後も変わりませんでしたGC.Collect
。
DataSet
不要になったときに sを使用してクリーンアップするための最良の方法を誰かが共有できれば、本当に感謝しています。
サンプルコードを以下に示します。
Imports System.Data.SqlClient;
Public Class Form1
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Test()
GC.Collect()
GC.Collect()
GC.Collect() 'Throw in one more
End Sub
Private Sub Test()
Dim oDA As SqlDataAdapter = Nothing
Dim oConn As SqlConnection = Nothing
Dim oCommand As SqlCommand = Nothing
Dim ods As DataSet = Nothing
Dim oDt As DataTable = Nothing
Try
oConn = New SqlConnection("Server=Myserv;Database=myDB;UserId=myuserid;Password=mypassword;")
oCommand = New SqlCommand("Select * from Users", oConn)
oConn.Open()
ods = New DataSet
oDA = New SqlDataAdapter(oCommand)
For i As Integer = 0 To 50
oDA.Fill(ods)
oDt = ods.Tables(0)
'oDt.Clear()
'oDt.Dispose()
oDt = Nothing
Next
Catch ex As Exception
MessageBox.Show(ex.ToString)
Finally
ods.Clear()
ods = Nothing
oConn.Close()
oDA = Nothing
End Try
End Sub
End Class
DataSet
編集: s および/またはs のメモリを管理するためのベスト プラクティスを探していますDataTable
。ここでは、作成メソッドが必ずしもメモリのクリーンアップを担当しているわけではありません。Nothing
また、オブジェクト/変数を関数内に設定するのは、スコープ外に出すだけとは異なるのはなぜですか。