Персональный блог Игоря Антонова aka "spider_net"

Поиск циклических ссылок в 1С:Предприятие 8.3.10


Рубрика: Программирование -> 1С:Предприятие
Метки: | |
Просмотров: 7116
Поиск циклических ссылок в 1С:Предприятие 8.3.10

Грядущий релиз платформы «1С:Предприятие» 8.3.10 должен включить множество интересных новинок, и одной из интересных для разработчика наверняка станет встроенный инструмент поиска циклических ссылок. Наличие в коде циклических ссылок - серьезный удар по потребляемым ресурсам. С виду невинный код, может запросто сожрать гигабайты оперативной памяти и проблему будет не так просто обнаружить.

Время жизни объектов в платформе «1С:Предприятие 8» определяется стратегией на основе подсчета ссылок (reference counting). Идея проверена временем и предельна проста. Для каждого объекта есть некий счетчик. При создании ссылки на объект – значение счетчика увеличивается на единицу. При удалении ссылки – наоборот, уменьшается. Как только счетчик становится равен нулю, платформа выполняет удаление объекта и занимаемая им память освобождается. Все достаточно просто. Проблемы начинаются, когда объекта ссылаются друг на друга – появляется циклическая ссылка.

Результатом становится утечка памяти – память, занимаемая таким объектом, не будет освобождена. Вот простой пример плохого кода:

ЦиклическаяСсылка = Новый Структура();
ЦиклическаяСсылка.Вставить("Параметр", 1);
ЦиклическаяСсылка.Встаивть("Параметр2", ЦиклическаяСсылка);

Чем больше циклических ссылок и чем «жирней» объекты, тем больше ресурсов будет находиться в «заморозке».

Безусловно, опытные разработчики редко допускают подобные огрехи, но в любой команде есть новички и не всегда есть ресурсы выполнить тщательное ревью их кода. Это один из примеров, когда встроенные в платформы инструменты могут предотвратить назревающую проблему. Компания 1С планирует добавить в версию 8.3.10 два инструмента для автоматизации процесс поиска циклических ссылок.

Первый инструмент позволяет полностью автоматизировать поиск циклических ссылок. Достаточно активировать новую опцию «Проверка циклических ссылок встроенного языка» и платформа возьмет на себя заботу поиска циклических ссылок. При обнаружении проблемы, платформа будет останавливать выполнение кода, и выдавать соответствующее предупреждение.

Этот режим будет полезен для разработки новых конфигураций, а вот для диагностики уже существующих решений полезно будет активировать одноименную опцию в журнале регистрации. В этом случае, платформа не будет прерывать выполнение кода, а будет записывать информацию об обнаруженных циклических ссылках в журнал регистрации под событием SCRIPTCIRCREFS.

Второй инструмент поиска циклических ссылок реализован в виде нового метода глобального контекста «ПроверитьЦиклическиеСсылкиВстроенногоЯзыка()». Он поможет обнаружить циклические ссылки в определенном участке из встроенного языка. Как следует из описание на «Зазеркалье»:

«С его помощью вы можете найти циклические ссылки, например, в нужный вам момент, или в той процедуре, которая вас интересует, или проанализировать ту переменную, которая вызывает у вас подозрение. Если вы не указываете параметры этого метода, то будут проанализированы все локальные переменные на стеке. Если вы передаёте в метод локальную переменную, то будет проанализирована только она.»
.

Оставьте комментарий!
comments powered by HyperComments