内存泄漏问题可能的原因?

时间:2011-05-27 22:18:23

标签: vb.net memory-leaks odbc

我为数据库构建了一个包装器DLL,它为我的数据库提供了一个对象API层。我遇到问题的地方是,当我销毁对象时,VB.net中的垃圾收集器似乎没有清理乱七八糟的东西。我相对肯定我已经做了一切来清理对象,包括在每个对象上实现IDispose接口来销毁所有东西。

当事情变得丑陋的是当我实例化对象时,我会进行数据库读取并根据对象在数据库中的相应条目填充对象。然而,这很有效,当我迭代创建和销毁1000和1000这些对象时,内存不断增加。

然后它发生在我身上:可能是我的对象无法清理,因为我在对象中使用共享ODBC数据库引用?尽管我付出了最大的努力,这会让我的物品保持活力吗?

例如:(注意: clsSharedConfig.g_objDatabaseConn是共享的ODBCConnection实例)

        Dim cmd As New OdbcCommand("SELECT * FROM FILES WHERE CID = " & p_lngID, clsSharedConfig.g_objDatabaseConn)
        Dim data As OdbcDataReader

        Try

            cmd.CommandType = CommandType.Text
            data = cmd.ExecuteReader()

任何人都可以提供任何其他原因吗?我不想不得不诉诸GC.Collect在任何地方的声明,以控制它!

谢谢,

安德鲁

3 个答案:

答案 0 :(得分:1)

您必须关闭阅读器才能释放资源。见下文

    Private Sub CmdReaderSample(ByVal cn As OleDbConnection, ByVal strCmd As String)
    Dim cmd As OleDbCommand = New OleDbCommand(strCmd, cn)
    cmd.CommandType = CommandType.Text
    Dim objReader As OleDbDataReader = cmd.ExecuteReader
    Try
        'read some stuff objReader.Read()
    Finally
        objReader.Close()
    End Try
End Sub

同时检查您的对象何时从阅读器加载,您也可以在那里保留参考。 使用像Ants memory profiler

这样的内存分析器可以更好地追踪内存泄漏

答案 1 :(得分:0)

您是否尝试过每次只实例化一个新的连接对象? .net框架将处理引擎盖下的实际连接池,所以我不确定尝试共享该对象无论如何都会帮助你。

答案 2 :(得分:0)

所以,我尝试了你的建议(感谢BTW!),但唉,没有变化......

然后,只是为了一个larf,我在我的DLL的应用程序设置中环顾四周。我注意到,由于某些愚蠢/未知的原因,我打开了COM兼容性。

所以,我没有检查过,前提是我不需要COM兼容性,这只是在寻找解决方案时遇到困难。我一做到了,我重新跑了,内存泄漏已经消失了!

真的?那是IT吗?我需要有人'慢慢地向我说这个,也许是用手偶。

内存分析器确认我的泄漏处于非托管内存中。

那是2天我没有回来......

安德鲁