Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Куда ушла память?
|
|||
|---|---|---|---|
|
#18+
Господа! Так случилось, что волею судьбы (а точнее сказать по желанию начальства) я теперь пишу на vb.net. Поскольку с Basic'ом и OLE DB я до не давнего времени не сталкивался вообще, кое-что у меня, конечно, выходит криво. Теперь собственно сам сабж: пишу милую прогу на vb.net для БД Access. Кучка форм, OLE DB, пара-тройка датасетов, которые создаются и заполняются программно. Все чинно, мило и что самое интересное - ВСЕ РАБОТАЕТ!!! Но! Недавно в диспетчере задач обратил внимание на количество памяти, которую жрет моя прога. Оказалось - всего ничего - около100 Mb. Тут я, конечно, слегка расстроился, а потому решил спросить совета у бывалых джедаев. Дело в том, что я как доверчивый чукотский юноша в своей проге ничего(коннекшн, датасет и т.п.) не закрываю (кроме форм) и не убиваю (я имею в виду vb-шный SET ... = Nothing). Делаю я это оттого, что ни в одном из виденных мной примеров ничего подобного я не встретил и решил, что dotnet настолько модная среда разработки, что делает это сама (например при закрытии формы). Итак, подскажите, плз: 1) Что может жрать столько памяти? 2) Надо ли закрывать коннекшены? 3) Надо ли явно убивать датасеты после их заполнения и вывода данных в dbgrid (этого бы делать не хотелось, т.к. они (датасеты) нужны мне для дальнейшей работы). Заранее премного благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2003, 07:54 |
|
||
|
Куда ушла память?
|
|||
|---|---|---|---|
|
#18+
открой рядом другой экземпляр своего приложения. Так же память жрет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2003, 14:36 |
|
||
|
Куда ушла память?
|
|||
|---|---|---|---|
|
#18+
Все точно так же. Может дело в том, что я для связи дочерней формы с родительской использую следующее: 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() я вроде делаю, а память при этом не освобождается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2003, 05:58 |
|
||
|
Куда ушла память?
|
|||
|---|---|---|---|
|
#18+
1. Ты не ту выбрал стратегию для работы с данными. Нафига тебе заполнять датасеты, если база локльная. Работай непосредственно с базой - так быствее будет. 2. перепеши: MainForm.Close() MainForm = Nothing End Sub ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2003, 09:31 |
|
||
|
Куда ушла память?
|
|||
|---|---|---|---|
|
#18+
1. Коннекшены лучше закрывать сразу. Пул коннектов позаботится об оптимальном количестве открытых соединений. Для Access под OLEDB надо явно разрешить пуллинг с помощью специального флажка в connection string - по умолчанию он отключён, а создание нового соединения занимает существенное время. Либо реюзать один и тот же коннекшн, если подразумевается однопользовательская работа. 2. Чтобы не уничтожать каждый объект явно, можно принудительно вызвать сборку мусора. Посмотри, уменьшится ли количество занимаемой памяти, если вызвать GC.Collect? Если не уменьшится, значит надо искать кто держит ссылки на эти объекты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2003, 12:44 |
|
||
|
Куда ушла память?
|
|||
|---|---|---|---|
|
#18+
А можно какой-нибудь примерчик работы с 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() - с тем же результатом. Время впадать а отчаянье. А не хотелось бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2003, 08:43 |
|
||
|
Куда ушла память?
|
|||
|---|---|---|---|
|
#18+
Делаю совсем просто: две формы. На form2 один батон, нажали - открылась form1. На form1 две кнопки: батон1 и батон2. Батон1 - открываем БД, выводим в датагрид; батон2 - Kill Them All !!! Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Код: 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. Нажимаем батон1, потом батон2. Прога как занимала 70 метров в памяти, так и занимает!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2003, 14:01 |
|
||
|
Куда ушла память?
|
|||
|---|---|---|---|
|
#18+
Сколько записей в таблице SSP? Может датасет жрёт столько? Попробуйте пройтись под дебаггером следя за размером занимаемой памяти. В первую очередь я бы закомментировал Ad.Fill(ds)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2003, 14:27 |
|
||
|
Куда ушла память?
|
|||
|---|---|---|---|
|
#18+
Проблема более менее решилась, когда я сделал форму модальной. Тогда все просто: сразу после отработки формы убиваю ее и вызываю GC. Imports System.GC frmSelSSP.ShowDialog() frmSelSSP = Nothing Collect() WaitForPendingFinalizers() Collect() А как тогда поступать, если форма не модальна? Если это MDIChild к примеру? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2003, 08:52 |
|
||
|
Куда ушла память?
|
|||
|---|---|---|---|
|
#18+
авторWaitForPendingFinalizers() Collect() А вот что они делают в подробностях то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2005, 20:09 |
|
||
|
|

start [/forum/topic.php?fid=20&msg=32233517&tid=1437244]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
59ms |
get topic data: |
9ms |
get forum data: |
4ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 212ms |
| total: | 355ms |

| 0 / 0 |
