![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
А бывают ли в Си# утечки памяти? Зачем нужен IDisposable? Часто ли он встречается? Если забыть Dispose, что будет? Как проконтролировать?
|
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 8 Всего: 67 |
Конечно утечки бывают...бажный код -> висячие ссылки на объекты -> сборщик мусора не убивает их...в итоге получаем утечку...
А насчёт IDisposable в MSDN всё предельно ясно написано...
Вопроса "Часто ли он встречается" я вообще не понял...вы о чём? Ответ на последние два вопроса лежит в приведённой выше цитате из MSDN -------------------- СУВ, Partizan. |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
Dims, еще можно добавить невыгружаемые генерируемые сборки и утечки дескрипторов.
Частота встречания зависит от опыта. Например, у класса XmlSerializer 9 конструкторов, из них 7 сильно текут. Это описано в документации, но кто ее читает... |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Это как? Можно поподробнее? Я не врубаюсь. Является ли это обязательным или это просто желательно? Тоже, если можно, поподробнее |
|||
|
||||
| Partizan |
|
||||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 8 Всего: 67 |
Dims,
Обязательным это не является. Использовать IDisposable необходимо, если ваш класс занимает unmanaged-ресурсы и при удалении объекта их необходимо освобождать. GС при удалении объекта IDisposable обязательно вызовет Dispose.
Ну, допустим у вас есть класс-коллекция с собственной имплементацией добавления / удаления объектов... Допустим реализация удаления немного бажная....и иногда объект из коллекции не удаляется, а новые объекты всё так же добавляются... В результате объекты, которые по сути нигде не используются остаются торчать в коллекции и GC их на тот свет никак не хочет забирать... В итоге получаем о-го-гошное отжирание памяти... Пример немного надуман, но общий смысл проблемы с "висящими ссылками", думаю, передаёт. -------------------- СУВ, Partizan. |
||||
|
|||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
LeakSample1 каждый раз создает динамическую сборку и не выгружает ее. И к тому же тормозит. Причины и последствия описаны в документации. LeakSample2 закрепляет объект в памяти перед передачей неуправляемому коду. И забывает открепить - не обязательно намеренно, может быть просто из-за исключения в неуправляемом коде. В результате в памяти образуется кусок, который GC не может освободить, и который ему приходится обходить при сборке мусора. Но чаще всего утечки - это просто висящие ссылки, часто неявные. Например, нестатические обработчики событий и callback-и. Но такие случаи можно отловить профайлером. |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Ну это не утечка памяти, а просто я сам не удаляю объекты. Откуда компьютер может знать, что они не нужны? Кстати, а что используется в качестве профайлера? |
|||
|
||||
| Partizan |
|
||||||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 8 Всего: 67 |
Вы и сами не знаете, что объекты не удаляете...вы думаете, что удаляете, а из-за багов в коде, объекты не удаляются фактически, потому-что ссылки остаются висеть...Я же сказал, что пример немного надуман, но демонстрирует проблему висящих ссылок. Есть более удачный пример...
.NET Profiler -------------------- СУВ, Partizan. |
||||||
|
|||||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
memprofiler.com и стандартный sos. Весь бонус сборщика мусора в том, что он сам знает какие объекты нужны. Возьми рихтера, там подробно расписан процесс. |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 8 Всего: 232 |
Dims, про память в дотнет на основе сборки мусора и поколений отлично у Джеффри Рихтера в книге расписано.
-------------------- ![]() |
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: нет Всего: 43 |
Утечек в pure MSIL не быввает.
Бывают ошибки, когда уже ненужные переменные "как будто нужны и используются", но это уже ошибки проектирования. |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
nerezus, тогда и в unmanaged коде утечек памяти не бывает. Просто неосвобожденная память "как будто нужна и используется" - обычная ошибка проектирования.
|
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: нет Всего: 43 |
PashaPash, мы можем присвоить ссылке другое значение в unmanaged коде, но объект в оперативке то остается. Это утечка.
|
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 8 Всего: 67 |
nerezus,
Переменная t ссылается на новый объект, старый объект остался... -------------------- СУВ, Partizan. |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
nerezus, в примере LeakSample2 выше ссылки на управляемый объект objectToPin уже нет, но он остается в оперативке и GC его обходит стороной. Есть только отметка "этот кусок памяти занят" - ну так она и в unmanaged коде есть. Это тоже утечка. В чистом MSIL.
Просто в managed понятие утечки шире - это когда объект живет дольше, чем должен по представлению разработчика. |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 8 Всего: 232 |
Старый поток вместе со старым объектом Thread подгребётся на следующей же сборке мусора -------------------- ![]() |
|||
|
||||
| elbjarn |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 13.4.2008 Где: Дубна Репутация: 1 Всего: 3 |
банальность:
вызовите метод Close() в обработчике OnLoad у формы - получите утечку |
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 8 Всего: 67 |
mr.DUDA, как старый поток подгребётся, если он ещё выполняется?
-------------------- СУВ, Partizan. |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | .NET для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |