Pharo Smalltalk - Есть ли способ принудительно освободить (dealloc) объект (экземпляр) (истекать сеансы и т. д.) во время разработки Seaside?

Когда вы хотите собрать мусор для определенного экземпляра, какое сообщение вы можете отправить?

Я взламываю приложение на базе Seaside, и многие вещи могут пойти наперекосяк, в том числе мой RootComponent с 10 экземплярами (это нормально), и я хотел бы начать все сначала (не новый образ)

Позднее редактирование: немного прочитав, очевидно, что этот вопрос является анафемой в мире автоматического сбора мусора, поэтому позвольте мне перефразировать.


person unom    schedule 28.01.2015    source источник
comment
Возможно, это связано с stackoverflow.com/questions/26019664/   -  person Uko    schedule 29.01.2015
comment
Вы правы, это частично связано, однако у меня возникает жуткое чувство при разработке в Pharo Smalltalk. Эта живая среда разработки фактически никогда не дает вам возможности протестировать ход выполнения программы с самого начала. Вы можете выделить некоторые объекты, а затем изменить способ распределения, так что теперь это больше не работает, и нет другого способа проверить это, кроме как «нулевые» переменные, поэтому срабатывает ленивая инициализация. Мне было интересно, есть ли рабочий процесс, который я упускаю из виду, заставляет все начинать «с нуля» каждый раз.   -  person unom    schedule 29.01.2015
comment
Присваивание уничтожает старые ссылки, поэтому вы можете не захотеть присваивать значение nil. Есть и другие рабочие процессы, о которых вы могли бы задать в новом вопросе (возможно, на форуме или Programmers.SE?). Например, вы можете экспортировать свою программу в систему контроля версий, например Monticello, и импортировать ее в чистый образ. Серверы Jenkins проектов Squeak и Pharo делают что-то подобное для некоторого кода.   -  person dcorking    schedule 29.01.2015


Ответы (1)


Невозможно заставить виртуальную машину собирать мусор для определенного объекта. Вы можете оценить Smalltalk garbageCollect. для принудительной сборки мусора, но это просто вызовет механизм сборки мусора виртуальной машины для всех объектов.

Здесь обычно две проблемы (по моему опыту):

  1. сборка мусора в Pharo VM использует два разных алгоритма для двух отдельных фаз (я полагаю, что это пометка и очистка и очистка). Таким образом, одного Smalltalk garbageCollect. может быть недостаточно для фактического удаления объекта. Вы часто будете видеть такой код, как 3 timesRepeat: [ Smalltalk garbageCollect ]., который пытается гарантировать, что объект будет собран. Также обратите внимание, что некоторые специальные объекты защищены от сборки мусора (например, nil, true, false и т. д.).
  2. в определенных ситуациях алгоритм сборки мусора оказывается неспособным разрешить все устаревшие объекты. Я видел, как это происходит с механизмом событий Morphic. Там событие — это просто закрытие в контексте метода. Даже если зарегистрированные объекты были удалены сборщиком мусора, некоторые события будут зависать (если ответственный объект не отменил их регистрацию правильно), создавая целые графы объектов, которые не могут быть собраны (поскольку корень не может быть собран). Я подозреваю, что реальная проблема заключается в какой-то круговой зависимости. Обратите внимание, что это исключительный случай и принудительная сборка мусора в целом работает достаточно хорошо.

С учетом сказанного, мы используем Seaside уже почти десять лет, и сбор мусора обычно является одной из наших наименьших забот. Когда нам нужно что-то собрать/очистить от мусора, обнуление переменных и принудительная сборка мусора (3 раза) делают свое дело.

Редактировать

В Seaside 2.8 вы можете оценить WARegistry clearAllHandlers., в Seaside 3 это примерно эквивалентно WAAdmin clearAll.. Эти операторы будут очищать активные и просроченные сеансы и уничтожать большую часть вещей, которые могут вас беспокоить. Примечание. #clearAll также удалит конфигурации и зарегистрированные точки входа. Используйте #clearSessions, если вы хотите только сбросить сеансы. Используйте #clearAll, если вам требуется более тщательная очистка.

Редактировать 2

Используйте myObject pointersTo., чтобы найти все указатели, указывающие на конкретный объект. Вы также можете щелкнуть правой кнопкой мыши запись в GTInspector и щелкнуть указатели открытия.

Вы также можете проверить PointerDetective, который пытается графически представить процесс поиска указателя. .

person Max Leske    schedule 29.01.2015
comment
Спасибо за редактирование 2. По теме: WAAdmin clearAll заставляет localhost:8080 отвечать с ошибкой 404 и /config или любой другой страницей с не найдено. Однако повторная регистрация приложения работает, и можно просто посетить /WhateverRoot. Конфигурации вроде нет? - person unom; 29.01.2015
comment
Ты прав. #clearAll очень хочет все очистить. Я обновил свой ответ. - person Max Leske; 29.01.2015
comment
Здорово! Огромное спасибо. - person unom; 29.01.2015