возможная причина утечки памяти? - PullRequest
0 голосов
/ 28 мая 2011

Я создал оболочку 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. Собирайте повсюду статистику, чтобы держать это под контролем!

Спасибо,

Andrew

Ответы [ 3 ]

1 голос
/ 28 мая 2011

Вы должны закрыть читателя, чтобы освободить ресурсы.См. Ниже

    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

0 голосов
/ 30 мая 2011

Итак, я попробовал ваши предложения (спасибо BTW!), Но, увы, без изменений ...

Затем, просто ради чего-то, я искал в настройках приложения для моей DLL.Я заметил, что по какой-то тупой / неизвестной причине у меня была включена совместимость с COM.

Итак, я снял этот флажок, исходя из того, что мне НЕ НУЖНА совместимость с COM, и что это просто мутит воду в поисках решения.Как только я это сделал и перезапустил, утечка памяти исчезла!

Серьезно?это было ЭТО?Мне нужно, чтобы кто-то медленно говорил мне об этом, возможно, используя ручных кукол.

Профилировщик памяти подтвердил, что моя утечка была в неуправляемой памяти.

это 2 дня, я не вернусь ...

Андрей

0 голосов
/ 28 мая 2011

Пытались ли вы каждый раз просто создавать новый объект подключения? .net Framework будет обрабатывать пул актуальных подключений под капотом, поэтому я не уверен, что попытка поделиться этим объектом в любом случае вам поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...