【发布时间】:2013-04-01 21:00:48
【问题描述】:
我正在尝试找出使用 DataSet/DataTable 并在之后正确清理的最佳方法。
我有点疑惑是什么导致内存被释放。我用一个测试应用程序测试了我的理论,我在一个循环中多次填充相同的DataTable,并在 3 次强制 GC 收集后查看 Windows 的任务管理器的内存占用情况。
我发现的是:
如果我没有调用
Clear或Dispose,或者将DataTable变量设置为Nothing,任务管理器中最终的内存消耗约为30k。如果我只是在循环内将变量设置为
Nothing,最终的内存大约为15k。
问题:为什么将变量设置为Nothing会有所不同?如果我只在循环内调用
Dispose方法,最终的内存大约是19k。如果我只在循环内调用
Clear,最终的内存大约是 16.5k。事实上,即使在GC.Collect之后它也没有改变。
如果有人能分享在不再需要时使用和清理DataSets 的最佳方式,我将不胜感激。
示例代码如下所示。
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
编辑:我正在寻找管理传递的DataSets 和/或DataTables 内存的最佳实践,其中创建方法不一定负责清理内存。另外,为什么在函数中将对象/变量设置为Nothing 与让它超出范围的效果不同。
【问题讨论】:
标签: .net vb.net memory-management memory-leaks dataset