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

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

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

Заранее премного благодарен.
...
Рейтинг: 0 / 0
10.08.2003, 14:36
    #32232126
vdimas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Куда ушла память?
открой рядом другой экземпляр своего приложения. Так же память жрет?
...
Рейтинг: 0 / 0
11.08.2003, 05:58
    #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
11.08.2003, 09:31
    #32232471
vdimas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Куда ушла память?
1. Ты не ту выбрал стратегию для работы с данными. Нафига тебе заполнять датасеты, если база локльная. Работай непосредственно с базой - так быствее будет.

2. перепеши:

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

2. Чтобы не уничтожать каждый объект явно, можно принудительно вызвать сборку мусора. Посмотри, уменьшится ли количество занимаемой памяти, если вызвать GC.Collect? Если не уменьшится, значит надо искать кто держит ссылки на эти объекты.
...
Рейтинг: 0 / 0
12.08.2003, 08:43
    #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
12.08.2003, 14:01
    #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
12.08.2003, 14:27
    #32234118
ValeryR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Куда ушла память?
Сколько записей в таблице SSP? Может датасет жрёт столько?
Попробуйте пройтись под дебаггером следя за размером занимаемой памяти.
В первую очередь я бы закомментировал Ad.Fill(ds)...
...
Рейтинг: 0 / 0
14.08.2003, 08:52
    #32236065
Леший
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Куда ушла память?
Проблема более менее решилась, когда я сделал форму модальной. Тогда все просто:
сразу после отработки формы убиваю ее и вызываю GC.

Imports System.GC

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

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

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

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


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