DataSet/を使用し、DataTable後で適切にクリーンアップする最良の方法を見つけようとしています。
メモリが解放される原因については、少し困惑しています。DataTableループ内で同じものを複数回入力するテスト アプリケーションで理論をテストし、 3 回の強制 GC 収集後のメモリ フットプリントについて Windows のタスク マネージャーを調べました。
私が見つけたのは次のとおりです。
Clearまたはを呼び出さなかった場合、または変数をにDispose設定しなかった場合、タスク マネージャーでの最終的なメモリ消費量は約 30k でした。DataTableNothing変数を
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また、オブジェクト/変数を関数内に設定するのは、スコープ外に出すだけとは異なるのはなぜですか。