我为数据库构建了一个包装器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在任何地方的声明,以控制它!
谢谢,
安德鲁
答案 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天我没有回来......
安德鲁