powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Куда ушла память?
11 сообщений из 11, страница 1 из 1
Куда ушла память?
    #32230653
Леший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа! Так случилось, что волею судьбы (а точнее сказать по желанию начальства) я теперь пишу на vb.net. Поскольку с Basic'ом и OLE DB я до не давнего времени не сталкивался вообще, кое-что у меня, конечно, выходит криво. Теперь собственно сам сабж: пишу милую прогу на vb.net для БД Access. Кучка форм, OLE DB, пара-тройка датасетов, которые создаются и заполняются программно. Все чинно, мило и что самое интересное - ВСЕ РАБОТАЕТ!!! Но! Недавно в диспетчере задач обратил внимание на количество памяти, которую жрет моя прога. Оказалось - всего ничего - около100 Mb. Тут я, конечно, слегка расстроился, а потому решил спросить совета у бывалых джедаев. Дело в том, что я как доверчивый чукотский юноша в своей проге ничего(коннекшн, датасет и т.п.) не закрываю (кроме форм) и не убиваю (я имею в виду vb-шный SET ... = Nothing). Делаю я это оттого, что ни в одном из виденных мной примеров ничего подобного я не встретил и решил, что dotnet настолько модная среда разработки, что делает это сама (например при закрытии формы).

Итак, подскажите, плз:

1) Что может жрать столько памяти?
2) Надо ли закрывать коннекшены?
3) Надо ли явно убивать датасеты после их заполнения и вывода данных в dbgrid (этого бы делать не хотелось, т.к. они (датасеты) нужны мне для дальнейшей работы).

Заранее премного благодарен.
...
Рейтинг: 0 / 0
Куда ушла память?
    #32232126
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
открой рядом другой экземпляр своего приложения. Так же память жрет?
...
Рейтинг: 0 / 0
Куда ушла память?
    #32232379
Леший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все точно так же. Может дело в том, что я для связи дочерней формы с родительской использую следующее:

Public Class AddForm2 'Родительская форма
Private Sub Select_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btZak.Click

Dim frmSelZak As frmSelectZak
frmSelZak = New frmSelectZak()
frmSelZak.MainForm = Me

.... Коннект к БД, заполнение датасета, вывод в датагрид и т.д.
...............
frmSelZak.ShowDialog()
End Sub
End Class

Public Class frmSelect 'Дочерняя форма
Inherits System.Windows.Forms.Form
Public MainForm As AddForm2

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim i As Integer

While i < ListBox1.Items.Count
MainForm.ListBox1.Items.Insert(0, ListBox1.Items.Item(i))
i = i + 1
End While
Close()
MainForm = Nothing
Me.Dispose()
End Sub
End Class

Т.е. в дочерней форме храню ссылку на родительскую. Делаю так для того чтобы выбранные данные из дочерней передать в родительскую для последующей обработки. Но в то же время Dispose() я вроде делаю, а память при этом не освобождается.
...
Рейтинг: 0 / 0
Куда ушла память?
    #32232471
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Ты не ту выбрал стратегию для работы с данными. Нафига тебе заполнять датасеты, если база локльная. Работай непосредственно с базой - так быствее будет.

2. перепеши:

MainForm.Close()
MainForm = Nothing
End Sub
...
Рейтинг: 0 / 0
Куда ушла память?
    #32232734
ValeryR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Коннекшены лучше закрывать сразу. Пул коннектов позаботится об оптимальном количестве открытых соединений. Для Access под OLEDB надо явно разрешить пуллинг с помощью специального флажка в connection string - по умолчанию он отключён, а создание нового соединения занимает существенное время.
Либо реюзать один и тот же коннекшн, если подразумевается однопользовательская работа.

2. Чтобы не уничтожать каждый объект явно, можно принудительно вызвать сборку мусора. Посмотри, уменьшится ли количество занимаемой памяти, если вызвать GC.Collect? Если не уменьшится, значит надо искать кто держит ссылки на эти объекты.
...
Рейтинг: 0 / 0
Куда ушла память?
    #32233517
Леший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно какой-нибудь примерчик работы с GC. Я вызвал q = GetTotalMemory(1) и он мне вернул 38'094'980 байт. Попробовал Collect() - память не освободилась. Пробовал даже так:

Conn.Close()
Conn.Dispose()
Comm.Dispose()
ds.Dispose()
Conn = Nothing
Comm = Nothing
ds = Nothing
q = GetTotalMemory(1)
Collect()

- с тем же результатом. Время впадать а отчаянье. А не хотелось бы.
...
Рейтинг: 0 / 0
Куда ушла память?
    #32234073
Леший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делаю совсем просто: две формы. На form2 один батон, нажали - открылась form1. На form1 две кнопки: батон1 и батон2. Батон1 - открываем БД, выводим в датагрид; батон2 - Kill Them All !!!

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Imports System.GC 
Public Class Form2 
    Inherits System.Windows.Forms.Form 
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
        Dim rrr As New Form1() 
 
        rrr.ShowDialog() 
        rrr.Dispose() 
        Collect() 
        WaitForPendingFinalizers() 
        Collect() 
    End Sub 
End Class 


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
mports System.Data.OleDb, System.GC 
Public Class Form1 
    Inherits System.Windows.Forms.Form 
 
    Public strConn, sSQL, srcFile As String 
    Public Comm As OleDbCommand 
    Public ds As DataSet 
    Public Conn As OleDbConnection 
    Public Ad As OleDbDataAdapter 
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
 
        Dim q As Long 
 
        ds = New DataSet() 
 
        DataGrid1.DataSource = ds 'Контрол Grid связываем с объектом DataSet 
 
        sSQL = "SELECT * FROM SSP" 
        srcFile = "form2.mdb" 
        Try 
            'Создаём и открываем соединение 
            Conn = New OleDbConnection() 
            Conn.ConnectionString =  "Provider=Microsoft.Jet.OLEDB.4 . 0 ;Data Source='" & srcFile & "'" 
            Conn.Open() 
 
            Comm = New OleDbCommand(sSQL, Conn) 'Создаём команду выборки данных 
            Comm.Connection = Conn 'Указываем команде нужное соединение 
 
            Ad = New OleDbDataAdapter() 'Создаём адаптер данных 
            Ad.SelectCommand = Comm 'Указываем команду выборки данных 
            Ad.Fill(ds,  "SSP" ) 'Заполняем DataSet.  
            DataGrid1.DataMember = ds.Tables( "SSP" ).TableName 
 
            Conn.Close() 
        Catch ex As Exception 
            MsgBox( "Тип ошибки: "  & ex.GetType.FullName & vbCrLf & ex.Message) 
        End Try 
    End Sub 
 
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 
        Close() 
        Conn.Dispose() 
        Comm.Dispose() 
        ds.Clear() 
        Conn = Nothing 
        Comm = Nothing 
        ds = Nothing 
        DataGrid1.Dispose() 
        Collect() 
        WaitForPendingFinalizers() 
        Collect() 
    End Sub 
End Class 


Нажимаем батон1, потом батон2. Прога как занимала 70 метров в памяти, так и занимает!!!
...
Рейтинг: 0 / 0
Куда ушла память?
    #32234118
ValeryR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сколько записей в таблице SSP? Может датасет жрёт столько?
Попробуйте пройтись под дебаггером следя за размером занимаемой памяти.
В первую очередь я бы закомментировал Ad.Fill(ds)...
...
Рейтинг: 0 / 0
Куда ушла память?
    #32236065
Леший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема более менее решилась, когда я сделал форму модальной. Тогда все просто:
сразу после отработки формы убиваю ее и вызываю GC.

Imports System.GC

frmSelSSP.ShowDialog()
frmSelSSP = Nothing
Collect()
WaitForPendingFinalizers()
Collect()

А как тогда поступать, если форма не модальна? Если это MDIChild к примеру?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Куда ушла память?
    #32924324
Фотография BusyMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторWaitForPendingFinalizers()
Collect()

А вот что они делают в подробностях то?
...
Рейтинг: 0 / 0
Куда ушла память?
    #32924417
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
статья Игоря Ткачева в журнале "RSDN Magazine" 02.2003

Автоматическое управление памятью в .NET
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Куда ушла память?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]