gpt4 book ai didi

.net - 数据集和内存泄漏

转载 作者:行者123 更新时间:2023-12-02 22:08:27 25 4
gpt4 key购买 nike

我正在尝试找出使用 DataSet/DataTable 并在之后正确清理的最佳方式。

有点疑惑是什么原因导致内存被释放。我用一个测试应用程序测试了我的理论,在该应用程序中我在循环中多次填充相同的 DataTable 并查看 Windows 的任务管理器以了解 3 次强制 GC 收集后的内存占用情况。

我发现的是:

  1. 如果我没有调用 ClearDispose,或者将 DataTable 变量设置为 Nothing ,最终任务管理器的内存消耗约为30k。

  2. 如果我只是在循环内将变量设置为 Nothing,则最终内存约为 15k。
    问题:为什么将变量设置为 Nothing 会有所不同?

  3. 如果我在循环内只调用了Dispose方法,最终内存大约是19k。

  4. 如果我在循环内只调用Clear,最终内存大约是 16.5k。事实上,即使在 GC.Collect 之后它也没有改变。

如果有人可以分享在不再需要时使用和清理 DataSet 的最佳方式,我将不胜感激。

示例代码如下所示。

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 和/或 DataTable 内存的最佳实践,其中创建方法不一定负责清理内存。此外,为什么在函数内将对象/变量设置为 Nothing 与仅仅让它超出范围的执行方式不同。

最佳答案

“清理”数据的最佳方式是切换到 Using statement对于任何实现 IDisposable1 的东西。实现此模式后,您设计的数据结构将获得最合理的内存使用。

Using oConn As New SqlConnection("Server=Myserv;Database=myDB;UserId=myuserid;Password=mypassword;")
oConn.Open()
Using oCommand As New SqlCommand("Select * from Users", oConn)
' other code as needed, wrap IDisposable in Using...EndUsing
End Using
End Using

这并不能保证您的数据结构本身具有内存效率,只是它们只会在必要时占用资源。

<子>1。是的,有时你不能使用 using 语句,但如果你在不使用 using 语句是错误的前提下工作,你会过得更好。

关于.net - 数据集和内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15751811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com