Страница: 1 |
Подскажите в чем разница конструкций: Obj=Nothing и Obj.Dispose и в какой из них освобождается память выделеная под обект
Если я правильно понял то obj = nothing уничтожает обьект, а obj.dispose деинициализирует. Значит разниуа примерно такая же как и при выборе способа удаления программы установленной на компьютере (можно удалить папку с програмой, а лучше воспользоватся деинсталятором) Риторический вопрос Почитай про сборку мусора, сейчас у мелкософта новая концепция по этому поводу, много статей на эту тему .... Неверно! Если сделать Nothing, то реально ресурсы освободятся только при сборе мусора. Если же использовать dispose, то объект прибъется, а зетем сразу же вызовется процедура сбора мусора. Умные люди советуют, что если объект предоставляет метод dispose, то лучше пользоваться именно им. К примеру для объекта Connection dispose, неявно вызывает метод close. "..., в CLR детерминированное завершение не поддерживается. Нельзя точно предсказать, когда будет вызван завершитель, а в некоторых случаях вызов завершителя вообще не гарантирован." Дан Эплман, "Переход на VB.Net". с.112 Провел несколько экспериментов с Dispose, Finalize, GC.Collect и =Nothing. Вот выводы (на оригинальность не претендую): 1. Если объект умирает сам по себе (выход из области видимости) или через =Nothing, по настоящему он уничтожается по завершении приложения, а метод Finalize , если определен, вызывается далеко не для всех объектов (у меня - 2-3 из 1000). 2. Если при тех же условиях вызвать GC.Collect, все мертвые объекты уничтожаются и методы Finalize вызываются во всех объектах, где определены. 3. Если для убиения объекта использовать Dispose, завершитель (Finalize) не вызывается вообще. ------------ Class MsgBox("Kill") End Страница: 1 |
Вопрос: Разнича между Obj=Nothing и Obj.Dispose
Добавлено: 23.09.03 21:58
Автор вопроса: Tovdi | ICQ: 160516960
Ответы
Всего ответов: 14
Номер ответа: 1
Автор ответа:
Last_Santa
ICQ: 200700724
Вопросов: 38
Ответов: 329
Web-сайт:
Профиль | | #1
Добавлено: 24.09.03 05:22
Номер ответа: 2
Автор ответа:
Creator
Вопросов: 11
Ответов: 61
Профиль | | #2
Добавлено: 24.09.03 06:44
Номер ответа: 3
Автор ответа:
grayk
Вопросов: 5
Ответов: 100
Профиль | | #3
Добавлено: 24.09.03 09:42
Dispose освобождает используемые ресурсы. По идее, если класс имеет метод Dispose (т.е. поддерживает интерфейс IDisposable), его обязательно надо использовать перед уничтожением объекта. Я так понял, что если его не использовать, сборщик мусора не сможет выполнить свой долг до конца. А память не освобождается ни в том, ни в другом случае. Тут как раз см. выше. Про новую концепцию мелкософта.
Номер ответа: 4
Автор ответа:
Alex3
ICQ: 9481061
Вопросов: 18
Ответов: 132
Профиль | | #4
Добавлено: 24.09.03 10:33
Номер ответа: 5
Автор ответа:
grayk
Вопросов: 5
Ответов: 100
Профиль | | #5
Добавлено: 24.09.03 10:57
Номер ответа: 6
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #6
Добавлено: 24.09.03 10:59
>Я так понял, что если его не использовать, сборщик мусора не сможет выполнить свой долг до конца.
А почему? Ведь GC должен удалять все объекты, на которые нет ссылок.
Раз мы убили ссылку (присваиванием Nothing), то значит объект будет
удалён при следующем запуске GC. Или я не прав?
Номер ответа: 7
Автор ответа:
grayk
Вопросов: 5
Ответов: 100
Профиль | | #7
Добавлено: 24.09.03 11:24
Прав. Но вот Д.Э. не советует на это особо надеяться. Вообще, тема "глуховатая", проверить все это трудно. Например, как узнать, съел GC ссылку на конкретный объект, или нет, если да, то когда?
Номер ответа: 8
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #8
Добавлено: 24.09.03 12:56
> проверить все это трудно
Согласен. Можно попробовать сделать огромный объект, например, класс,
в котором будет создаваться массив с 10000000 Integer'ов. И потом в
диспетчере задач смотреть...
Номер ответа: 9
Автор ответа:
grayk
Вопросов: 5
Ответов: 100
Профиль | | #9
Добавлено: 24.09.03 13:08
Ага. На что будем смотреть? Где живет этот дворник - в процессе нашего приложения, или где-то в дебрях frameworks? Кажется, надо этот большой объект создавать и убивать неоднократно, чтоб до GC дошло. А может быть, определить в нем (классе) метод Finalize и всунуть туда какой-нибудь MsgBox? Как думаешь?
Номер ответа: 10
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #10
Добавлено: 24.09.03 15:59
> Где живет этот дворник
А кто его знает...
> Кажется, надо этот большой объект создавать и убивать неоднократно
А если запустить сборку мусора вручную?
> определить в нем (классе) метод Finalize
Это зачем?
Номер ответа: 11
Автор ответа:
grayk
Вопросов: 5
Ответов: 100
Профиль | | #11
Добавлено: 25.09.03 09:50
А вот дико сложный код тестового класса:
Inherits System.ComponentModel.ComponentProtected Overrides Sub Finalize()
End Sub
Номер ответа: 12
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #12
Добавлено: 25.09.03 12:35
Так ты ничего не добьёшься... Насколько я понял, читая Эплмана, для
приложения выделяется кусок памяти и когда весь кусок заполняется,
вызывается GC. То есть нужно в этот класс добавить какой-нть большой
набор левых данных, например, формировать массив a(1000000) as
integer. Тогда возможно будет толк.
Номер ответа: 13
Автор ответа:
grayk
Вопросов: 5
Ответов: 100
Профиль | | #13
Добавлено: 26.09.03 11:09
Это чтобы заставить уборщика поработать - согласен. Но схема работы, по-видимому, будет та же, что и при ручном вызове. А размер кучи мы все равно ни задать, ни проконтролировать не сможем.
Номер ответа: 14
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #14
Добавлено: 27.09.03 06:01
На gotdotnet.ru:
Сборка мусора - это механизм, позволяющий компьютеру определить, когда объект более недоступен. Тогда он автоматически освобождает память, используемую этим объектом (вызывая функцию finalizer, реализованную пользователем). Некоторые сборщики мусора (в т.ч. используемый в .NET), "сжимают" память, уменьшая количество ресурсов, используемых вашей программой.
То есть финализеры должны вызываться при сборке мусора.
grayk: а если попробовать создать/удалить эдак 1000 экземпляров
класса, а потом вручную вызвать GC.Collect?
Дополнительная информация о сборке мусора:
http://msdn.microsoft.com/msdnmag/issues/1100/GCI/GCI.asp
http://msdn.microsoft.com/msdnmag/issues/1200/GCI2/GCI2.asp