Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Куда девалась память? Добавлено: 08.08.03 06:56  

Автор вопроса:  Леший

Господа! Так случилось, что волею судьбы (а точнее сказать по прихоти начальства) я теперь пишу на vb.net. Поскольку с Basic'ом я до не давнего времени не сталкивался вообще, кое-что у меня, конечно, выходит криво.  Теперь собственно сам сабж: пишу милую прогу на vb.net для БД Access. Кучка форм, OLE DB, пара-тройка датасетов, которые создаются и заполняются программно. Все чинно, мило и что самое интересное - ВСЕ РАБОТАЕТ!!! Но! Недавно в диспетчере задач обратил внимание на количество памяти, которую жрет моя прога. Оказалось - всего ничего - около100 Mb. Тут я, конечно, слегка расстроился, а потому решил спросить совета у бывалых джедаев. Дело в том, что я как доверчивый чукотский юноша в своей проге ничего(коннекшн, датасет и т.п.) не закрываю (кроме форм) и не убиваю (я имею в виду vb-шный SET ... = Nothing). Делаю я это оттого, что ни в одном из виденных мной примеров ничего подобного я не встретил и решил, что dotnet настолько модная среда разработки, что делает это сама (например при закрытии формы).

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

1) Что может жрать столько памяти?

2) Надо ли закрывать коннекшены?

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

Заранее премного благодарен.

Ответить

  Ответы Всего ответов: 6  

Номер ответа: 1
Автор ответа:
 Mutabor



Вопросов: 1
Ответов: 13
 Профиль | | #1 Добавлено: 08.08.03 10:14

Описаный случай - неоспоримый факт о том, что - VS.NET среда с высокими требованиями и подобное не может не раздражать,   а что по поводу закрытия форм - советуется разрушать класс - например me.dispose() или form2.dispose(). Если разрушить датасет - тогда потеря всего содержимого..

 

Ответить

Номер ответа: 2
Автор ответа:
 Mutabor



Вопросов: 1
Ответов: 13
 Профиль | | #2 Добавлено: 08.08.03 15:29

а вот более подробный разбор полётов -

http://www.dotsite.ru/Publications/PublicationDetails.aspx?ID=137

Ответить

Номер ответа: 3
Автор ответа:
 Леший



Вопросов: 2
Ответов: 4
 Профиль | | #3 Добавлено: 12.08.03 08:47
А можно какой-нибудь примерчик работы с 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()

- с тем же результатом. Время впадать а отчаянье. А не хотелось бы.

Ответить

Номер ответа: 4
Автор ответа:
 Mutabor



Вопросов: 1
Ответов: 13
 Профиль | | #4 Добавлено: 12.08.03 14:58

Сам рою сейчас по этому вопросу, но ещё 1 линк посматри, может, что надыбаешь

http://www.gotdotnet.ru/default.aspx?s=doc_chapt&c_no=78&d_no=24201

Ответить

Номер ответа: 5
Автор ответа:
 Mutabor



Вопросов: 1
Ответов: 13
 Профиль | | #5 Добавлено: 12.08.03 17:28

И ещё- из компьютерной газеты A-Z:

Garbage Collector
Другим орудием главного калибра в лобовых атаках на мозг читателя, как правило, является некая сущность под названием Garbage Collector ("сборщик мусора"). Почти каждый автор, пишущий на тему Net Framework, считает своим долгом посвятить его работе не один десяток страниц. Дополнительный шарм происходящему придает то, что вам как будущему программисту C# требуется знать о нем всего три вещи. Во-первых, то, что он вообще существует в природе. Во-вторых, то, что он вызывается последовательностью команд:
System.GC.Collect();
System.GC.WaitForPendingFi-nalizers();
System.GC.Collect();
В третьих, его следует вызывать после того, как вы создадите в программе сразу много объектов, а потом их все уничтожите. Вот, собственно, и вся нужная вам информация!
Фактически полным аналогом Garbage Collector является привычная любому пользователю Windows Корзина. Точно так же удаленные объекты попадают сначала в нее, некоторое время там болтаются, пока не будут вытеснены в никуда вновь поступающими объектами или же не уничтожатся по прошествии некоторого времени. Точно так же вы вольны в любой момент вручную "вынести" эту корзину. Аналогия практически полная, за исключением одного очень важного исключения. Корзине вы можете объяснить, сколько памяти она должна занимать на диске. Со сборщиком мусора все не так просто.

Как-то я написал несложную программу, которая выводила на экран некий рисунок и позволяла его масштабировать. Через некоторое время я обратил внимание на то, что, если долго двигать картинку взад-вперед с помощью полос скроллинга, программа начинает работать все медленнее и медленнее. Более того, после продолжительного вращения колесика мышки и сам Windows XP начал постепенно "загибаться" под деловитые звуки непрерывного шуршания винчестера. Как оказалось при ближайшем рассмотрении, удаленные объекты просто не уничтожались, по всей видимости, в связи с тем, что с точки зрения сборщика мусора у меня оперативки было просто завались, и торопиться было некуда! Целых 512 Мб плюс xxx Гб своп-файла!!! Принудительный его запуск с помощью вышеуказанных команд сразу решил все проблемы. С другой стороны, если вы не осуществляете массированного создания и удаления объектов, он работает вполне корректно. Поэтому в вопросе ручного запуска сборки мусора необходим разумный баланс, так как с точки зрения быстродействия это довольно медленная операция.
На этой ноте я считаю теоретическую часть темы "сборщика мусора" полностью рассмотренной. Позже по тексту статьи я вам приведу примеры использования механизма сборки мусора в реальном коде.

Ответить

Номер ответа: 6
Автор ответа:
 Леший



Вопросов: 2
Ответов: 4
 Профиль | | #6 Добавлено: 14.08.03 08:51

Проблема более менее решилась, когда я сделал форму модальной. Тогда все просто:
сразу после отработки формы убиваю ее и вызываю GC.
 
Imports  System.GC
 
        frmSelSSP.ShowDialog()
        frmSelSSP = Nothing
        Collect()
        WaitForPendingFinalizers()
        Collect()
 
А как тогда поступать, если форма не модальна? Если это MDIChild к примеру?

 

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам