Мозаичный форум  

Вернуться   Мозаичный форум > Территория общения > Персональные разделы > M.O.D.U.S.
Галерея Справка Пользователи Календарь Поиск Сообщения за день Все разделы прочитаны

M.O.D.U.S. Метафизика одиозного деконструктивизма услаждающих структур Персональный раздел Modus-а

Ответ
 
Опции темы
Старый 28.03.2010, 18:53   #1
Modus
дитя Ренессанса
 
Аватар для Modus
 
Регистрация: 29.05.2008
Сообщений: 2,346
Modus мастерModus мастерModus мастерModus мастерModus мастерModus мастерModus мастерModus мастерModus мастерModus мастерModus мастер
Утекание, или Как положить "абсолютно надёжную систему"

Где-то в конце 80-х годов был изобретён сборщик мусора - механизм для автоматического отслеживания использования динамической памяти. Утечки памяти считались одними из самых коварных ошибок, так как поздно диагностировались. Казалось бы, в дотнете, при использовании сборщика мусора, с этой проблемой покончено.

Но возьмем следующий сценарий.

Есть у нас кэш, в котором хранятся объекты, поддерживающие оповещение о смене свойств. Кэш реализован как статический словарь. Затем есть какой-то метод, который для своей создаёт коллекцию, которая подписывается на событие оповещения о смене свойств объектов, которые в ней находятся. При этом объекты берутся из кэша и кладутся в эту коллекцию. Коллекция на них автоматически подписывается.

Метод отработал. Коллекция больше не нужна. Но это не значит, что она автоматически уничтожится сборщиком мусора. Сборщик мусора обнаружит, что в статическом поле лежит объект, на событие которого подписана эта коллекция, которая больше ниоткуда недоступна. Но этой подписки достаточно для того, чтобы кэш держал её, не давая сборщику мусора её прибить.

Метод вызывается много раз. В итоге к закэшированным объектам подписываются всё новые экземпляры коллекций, которые уже никак не уничтожить. И всё, приехали.
__________________
Инструменты сердятся, когда на них не играют
Modus вне форума   Ответить с цитированием
Старый 28.03.2010, 21:48   #2
Иеро
Дед Мозай
 
Аватар для Иеро
 
Регистрация: 03.02.2006
Адрес: Москва
Сообщений: 11,274
Иеро мозаика мираИеро мозаика мираИеро мозаика мираИеро мозаика мираИеро мозаика мираИеро мозаика мираИеро мозаика мираИеро мозаика мираИеро мозаика мираИеро мозаика мираИеро мозаика мира
Мдя, вспоминается старый метод программинга - написал процедуру захвата памяти - сразу пишь процедуру освобождения, только потом раздвигешь строки между этими процедурами и пишешь процедуру, ради которой эту память захватывал.
__________________
При необходимости личного обращения стучитесь в скайп по нику dimontsi
Иеро вне форума   Ответить с цитированием
Старый 28.03.2010, 22:33   #3
SerejaKu
Старожил
 
Аватар для SerejaKu
 
Регистрация: 15.02.2007
Адрес: Екатеринбург
Сообщений: 5,750
SerejaKu мозаика мираSerejaKu мозаика мираSerejaKu мозаика мираSerejaKu мозаика мираSerejaKu мозаика мираSerejaKu мозаика мираSerejaKu мозаика мираSerejaKu мозаика мираSerejaKu мозаика мираSerejaKu мозаика мираSerejaKu мозаика мира
WeakReference -
Представляет слабую ссылку, которая указывает на объект, но позволяет удалять его сборщику мусора. Правда остаётся проблема очистки памяти от самих WeakReference.
__________________
Пока живут растаманы из глубинки - Вавилону не устоять!

Последний раз редактировалось SerejaKu; 29.03.2010 в 12:34.
SerejaKu вне форума   Ответить с цитированием
Старый 29.03.2010, 13:01   #4
Afa
Шволочь. И провокатор.
 
Аватар для Afa
 
Регистрация: 12.02.2006
Сообщений: 31,006
Afa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мира
хх
а какого хрена в статический объект шо т поклали?
буратины как есть.
статика - то, что существует весь цикл жизни программы. на что гарантированно есть линк пока жива программа. а чо вы творите?
__________________
... Survivors will be shot again.
Afa вне форума   Ответить с цитированием
Старый 29.03.2010, 15:32   #5
Modus
дитя Ренессанса
 
Аватар для Modus
 
Регистрация: 29.05.2008
Сообщений: 2,346
Modus мастерModus мастерModus мастерModus мастерModus мастерModus мастерModus мастерModus мастерModus мастерModus мастерModus мастер
Цитата:
статика - то, что существует весь цикл жизни программы
именно для этого.
__________________
Инструменты сердятся, когда на них не играют
Modus вне форума   Ответить с цитированием
Старый 29.03.2010, 19:39   #6
Afa
Шволочь. И провокатор.
 
Аватар для Afa
 
Регистрация: 12.02.2006
Сообщений: 31,006
Afa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мира
ну и. мусор на входе - мусор на выходе. кто сказал, что закэшированные данные доступны всю жизнь программы? они вообще умирать должны быстрее объектов - пять минут не трогали - ссылка подохла. вынести их нахрен в мемкэшед и пусть автоматом экспайрятся, если самим лень чистильщика хэша делать.
__________________
... Survivors will be shot again.
Afa вне форума   Ответить с цитированием
Старый 29.03.2010, 19:41   #7
Afa
Шволочь. И провокатор.
 
Аватар для Afa
 
Регистрация: 12.02.2006
Сообщений: 31,006
Afa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мира
Цитата:
Сообщение от Иеро Посмотреть сообщение
Мдя, вспоминается старый метод программинга - написал процедуру захвата памяти - сразу пишь процедуру освобождения, только потом раздвигешь строки между этими процедурами и пишешь процедуру, ради которой эту память захватывал.
не забывая обернуть begin ... ensure ... end - а то первый жеж эксэпшен обрушит всё здание
__________________
... Survivors will be shot again.
Afa вне форума   Ответить с цитированием
Старый 29.03.2010, 21:33   #8
Modus
дитя Ренессанса
 
Аватар для Modus
 
Регистрация: 29.05.2008
Сообщений: 2,346
Modus мастерModus мастерModus мастерModus мастерModus мастерModus мастерModus мастерModus мастерModus мастерModus мастерModus мастер
Цитата:
кто сказал, что закэшированные данные доступны всю жизнь программы?
закэшированные данные доступны, пока они актуальны. А кэш как точка доступа к этим данным должна быть доступна всю жизнь программы. И быть единственной.

Кстати, даже если просто в методе Main сделать переменную, в которую всё кэшировать - эффект будет тот же самый.

Проблема не в том, что закэшированные данные не очищаются - они и не должны этого делать до потери актуальности. Проблема в том, что они держат другие объекты, которые когда-то к ним обращались, но больше не нужны.
__________________
Инструменты сердятся, когда на них не играют
Modus вне форума   Ответить с цитированием
Старый 29.03.2010, 23:10   #9
Afa
Шволочь. И провокатор.
 
Аватар для Afa
 
Регистрация: 12.02.2006
Сообщений: 31,006
Afa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мира
я повторю.
указатель на объект должен жить определенное время самый простой способ гарантировать жизнь не больше времени - завести два кэша, один старый второй новый. раз в пять минут чистить указатели в старом и менять указатели старого и нового кэшей. указатели на объекты пихать в новый - в том числе и из старого кэша, если найден там. начинать поиск закэшированного - в новом кэше, заканчивать в старом.
примитивная конструкция придумана на ходу.
пысы. посмотри, если найдешь на построение гц в смалтолке. голубая книга вроде описывала. там идей забавных и возможных ловушек описано много - в том числе лечение чистки при кольцевых ссылках - введением обязательного условия ссылки на закольцованную структуру из-за пределов кольца, а то и наличие пути к колечку от центрального словаря.
__________________
... Survivors will be shot again.
Afa вне форума   Ответить с цитированием
Старый 10.11.2010, 01:15   #10
Modus
дитя Ренессанса
 
Аватар для Modus
 
Регистрация: 29.05.2008
Сообщений: 2,346
Modus мастерModus мастерModus мастерModus мастерModus мастерModus мастерModus мастерModus мастерModus мастерModus мастерModus мастер
Цитата:
примитивная конструкция придумана на ходу.
Допотопные костыли. Особенно актуально после того, как SerejaKu дал исчерпывающий ответ на поднятый вопрос.

Вообще, философский смысл темы состоит в том, что наличие сборщика мусора создаёт иллюзию, что утечки памяти невозможны. Пока ВНЕЗАПНО на них не напорешься. В обсуждении этого прецедента с коллегами даже прозвучала такая мысль, что при написании кода на C++ вероятность наступить на подобные грабли меньше, так как точно знаешь, что сборщика мусора нет, и за динамической памятью нужно явно следить.
__________________
Инструменты сердятся, когда на них не играют
Modus вне форума   Ответить с цитированием
Старый 10.11.2010, 14:33   #11
Afa
Шволочь. И провокатор.
 
Аватар для Afa
 
Регистрация: 12.02.2006
Сообщений: 31,006
Afa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мираAfa мозаика мира
Цитата:
Сообщение от Modus Посмотреть сообщение
Допотопные костыли. Особенно актуально после того, как SerejaKu дал исчерпывающий ответ на поднятый вопрос.

Вообще, философский смысл темы состоит в том, что наличие сборщика мусора создаёт иллюзию, что утечки памяти невозможны. Пока ВНЕЗАПНО на них не напорешься. В обсуждении этого прецедента с коллегами даже прозвучала такая мысль, что при написании кода на C++ вероятность наступить на подобные грабли меньше, так как точно знаешь, что сборщика мусора нет, и за динамической памятью нужно явно следить.
хмык.
к чему приводит явное слежение за памятью при исключениях? ну и мелочи вроде необходимости виртуальных деструкторов и других вкусностей я даже вспоминать не хочу.
прелесть сборщика ровно в том, что до узкого места его можно не вспоминать. а узким становится хорошо если процент кода. и - при наступлении вдруг оказывается, что неправильно алгоритмически задачу решали -- получаем отличный пинок для переписывания куска кода более аккуратно, ага.
да, само-собой, узкие места определяться должны до продакшна. на стадии тестирования, хотя б нагрузочного. в идеале - вообще на прототипе отловлены.
__________________
... Survivors will be shot again.
Afa вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 15:06.