OberonCore
https://forum.oberoncore.ru/

дескрипторы типов не выгружаются с модулем -> утечка памяти?
https://forum.oberoncore.ru/viewtopic.php?f=2&t=3707
Страница 1 из 2

Автор:  Info21 [ Понедельник, 05 Декабрь, 2011 17:09 ]
Заголовок сообщения:  дескрипторы типов не выгружаются с модулем -> утечка памяти?

Один мой бывший байтик, закончивший курс год назад, пытается запустить ББ на Хайку. И он такой, что, не ровён час, запустит :D

Тем временем сообщил о следующей проблеме:

Когда модули выгружаются, то их дескрипторы типов остаются в памяти. И не собираются сборщиком мусора.
Он говорит, что даже проверил многократной загрузкой-выгрузкой модуля -- это де заканчивается обломом.

Кто-нибудь сталкивался с этим? Какие будут мысли?

Автор:  Trurl [ Понедельник, 05 Декабрь, 2011 18:02 ]
Заголовок сообщения:  Re: дескрипторы типов не выгружаются с модулем -> утечка пам

Модули фактически не выгружаются.

Автор:  Александр Ильин [ Понедельник, 05 Декабрь, 2011 18:02 ]
Заголовок сообщения:  Re: дескрипторы типов не выгружаются с модулем -> утечка пам

А в чём проблема?

Выгружаются, насколько я помню, глобальные переменные и код, а дескрипторы типов должны оставаться в памяти. Только вот не помню, почему. Кто знает?

Автор:  Евгений Темиргалеев [ Понедельник, 05 Декабрь, 2011 20:27 ]
Заголовок сообщения:  Re: дескрипторы типов не выгружаются с модулем -> утечка пам

Александр Ильин писал(а):
Выгружаются, насколько я помню, глобальные переменные и код, а дескрипторы типов должны оставаться в памяти. Только вот не помню, почему. Кто знает?
Потому что в куче могут быть экземпляры этих типов. Тов. Ермаков может чего подробнее разъяснит, он на ентом деле собаку съел.

Автор:  Info21 [ Понедельник, 05 Декабрь, 2011 21:18 ]
Заголовок сообщения:  Re: дескрипторы типов не выгружаются с модулем -> утечка пам

Евгений Темиргалеев писал(а):
Потому что в куче могут быть экземпляры этих типов.
Именно.
Но ведь и дескрипторы могут быть мусором -- если их миллионы и миллионы, а никто на них не ссылается.

Представим себе круглосуточный всемирный дистанционный олимпиадный (ну, пусть) сервер, причем задачки требуют типов.

Цитата:
Тов. Ермаков может чего подробнее разъяснит, он на ентом деле собаку съел.
Пусть тогда разъясняет.

Автор:  Алексей Елин [ Понедельник, 05 Декабрь, 2011 21:43 ]
Заголовок сообщения:  Re: дескрипторы типов не выгружаются с модулем -> утечка пам

Евгений Темиргалеев писал(а):
Александр Ильин писал(а):
Выгружаются, насколько я помню, глобальные переменные и код, а дескрипторы типов должны оставаться в памяти. Только вот не помню, почему. Кто знает?
Потому что в куче могут быть экземпляры этих типов. Тов. Ермаков может чего подробнее разъяснит, он на ентом деле собаку съел.

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

Так что меня сомнения берут, что модуль можно выгрузить при наличии экземпляров его типов. К тому же защититься от этого достаточно просто: надо считать количество созданий/освобождений экземпляров любого типа модуля (как динамически, так и на стеке).

Автор:  Trurl [ Понедельник, 05 Декабрь, 2011 21:46 ]
Заголовок сообщения:  Re: дескрипторы типов не выгружаются с модулем -> утечка пам

Александр Ильин писал(а):
Выгружаются, насколько я помню, глобальные переменные и код, а дескрипторы типов должны оставаться в памяти.

Код остается в памяти, а глобальные переменные обнуляются.

Автор:  Александр Ильин [ Понедельник, 05 Декабрь, 2011 21:58 ]
Заголовок сообщения:  Re: дескрипторы типов не выгружаются с модулем -> утечка пам

Алексей Елин писал(а):
Если остаются экземпляры типов, то нелзя выгружать и глобальные переменные модуля, и тем более код. Иначе через экземпляр в любой момент можно вызвать выгруженный код а он может обратиться к выгруженной переменной, уже занятым другими данными.

Так что меня сомнения берут, что модуль можно выгрузить при наличии экземпляров его типов. К тому же защититься от этого достаточно просто: надо считать количество созданий/освобождений экземпляров любого типа модуля (как динамически, так и на стеке).
Глобальные переменные не "выгружаются" в смысле уничтожения, просто теряется на них ссылка, и они соберутся сборщиком мусора как обычно (если остались другие ссылки, то не соберутся).

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

Насколько я знаю, выгруженный код не может обратиться к выгруженной переменной, так как выгруженный блок памяти помечается как неисполняемый и, соответственно, ОС выбросит исключение при попытке передать туда управление.

Не думаю, что имеет смысл считать число экземпляров для всех типов, тем более что записи могут размещаться на стеке. Я думаю, что вполне реализуемо вот что: при сборке мусора можно ставить флажок во всех дескрипторах, для которых нашёлся хотя бы один экземпляр объекта. Если модуль выгружен, и в его дескрипторах не установился ни один флажок, весь блок дескрипторов можно выгрузить.

Автор:  Алексей Елин [ Понедельник, 05 Декабрь, 2011 21:58 ]
Заголовок сообщения:  Re: дескрипторы типов не выгружаются с модулем -> утечка пам

Trurl писал(а):
Код остается в памяти, а глобальные переменные обнуляются.

Т.е. как и (сборки) в .NET, модули не выгружаются никогда?

Автор:  Алексей Елин [ Понедельник, 05 Декабрь, 2011 22:04 ]
Заголовок сообщения:  Re: дескрипторы типов не выгружаются с модулем -> утечка пам

Александр Ильин писал(а):
...Я думаю, что вполне реализуемо вот что: при сборке мусора можно ставить флажок во всех дескрипторах, для которых нашёлся хотя бы один экземпляр объекта. Если модуль выгружен, и в его дескрипторах не установился ни один флажок, весь блок дескрипторов можно выгрузить.

Но это по сути обычная сборка мусора, только ссылки на дескрипторы из типа должны быть типизированы а дескрипторы надо создавать динамически при загрузке модуля и хранить скрытые ссылки на них в этом самом модуле. И не надо никаких доп. флагов...

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

Автор:  Александр Ильин [ Понедельник, 05 Декабрь, 2011 22:22 ]
Заголовок сообщения:  Re: дескрипторы типов не выгружаются с модулем -> утечка пам

Алексей Елин писал(а):
Но это по сути обычная сборка мусора, только ссылки на дескрипторы из типа должны быть типизированы а дескрипторы надо создавать динамически при загрузке модуля и хранить скрытые ссылки на них в этом самом модуле. И не надо никаких доп. флагов...

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

Автор:  Алексей Елин [ Понедельник, 05 Декабрь, 2011 22:31 ]
Заголовок сообщения:  Re: дескрипторы типов не выгружаются с модулем -> утечка пам

Александр Ильин писал(а):
Мне кажется, что в целом вы правы, только в последнем предложении сделали слишком сильное утверждение. Не модуль может быть собран, а дескриптор типа, принадлежащий уже выгруженному модулю. Сам модуль, конечно, нельзя выгружать только по признаку отсутствия переменных.

Я неточно выразился. Я имел ввиду что модуль, как и дескрипторы, может быть собран когда на него нет ссылок ни из дескрипторов, ни из других локальных/глобальных переменных в других модулях, тем же самым сборщиком мусора. При загрузке создать динамически дескриптор модуля и прописывать ссылку на него из всех дескрипторов типов содержащихся в нем, а также в глобальном листе модулей.

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

Автор:  Trurl [ Вторник, 06 Декабрь, 2011 07:34 ]
Заголовок сообщения:  Re: дескрипторы типов не выгружаются с модулем -> утечка пам

Александр Ильин писал(а):
Глобальные переменные не "выгружаются" в смысле уничтожения, просто теряется на них ссылка, и они соберутся сборщиком мусора как обычно (если остались другие ссылки, то не соберутся).

Какие могут быть ссылки на глобальные переменные?

Автор:  Trurl [ Вторник, 06 Декабрь, 2011 07:39 ]
Заголовок сообщения:  Re: дескрипторы типов не выгружаются с модулем -> утечка пам

Info21 писал(а):
Представим себе круглосуточный всемирный дистанционный олимпиадный (ну, пусть) сервер

Делать такой сервер через LoadModule/UnloadModule в любом случае не стоит.

Автор:  Александр Ильин [ Вторник, 06 Декабрь, 2011 08:03 ]
Заголовок сообщения:  Re: дескрипторы типов не выгружаются с модулем -> утечка пам

Trurl писал(а):
Какие могут быть ссылки на глобальные переменные?
Не, такого быть не может. Я имел в виду копии глобальных указателей.

Автор:  Info21 [ Вторник, 06 Декабрь, 2011 11:18 ]
Заголовок сообщения:  Re: дескрипторы типов не выгружаются с модулем -> утечка пам

Trurl писал(а):
Info21 писал(а):
Представим себе круглосуточный всемирный дистанционный олимпиадный (ну, пусть) сервер
Делать такой сервер через LoadModule/UnloadModule в любом случае не стоит.
А как стоит?

Грузить независимый ББ для каждой задачки? Ну, или для серии задачек -- и убивать его после тысячи задачек?

Автор:  Илья Ермаков [ Среда, 07 Декабрь, 2011 13:43 ]
Заголовок сообщения:  Re: дескрипторы типов не выгружаются с модулем -> утечка пам

Коллеги, работает сейчас оно так:
есть список дескрипторов модулей Kernel.modList, в нём находятся как загруженные, так и выгруженные модули. Т.е. он только "раздувается". Перезагрузили 100 раз модуль - будет для него 100 дескрипторов. Отличить дескрипторы выгруженных модулей можно по счётчику ссылок импорта от других модулей ref < 0.
Для выгружаемого модуля уничтожаются секции кода и глобальных переменных (code и data). Блок метаинформации остаётся, как есть.

Автор:  Info21 [ Среда, 07 Декабрь, 2011 14:17 ]
Заголовок сообщения:  Re: дескрипторы типов не выгружаются с модулем -> утечка пам

Илья Ермаков писал(а):
Коллеги, работает сейчас оно так:
есть список дескрипторов модулей Kernel.modList, в нём находятся как загруженные, так и выгруженные модули. Т.е. он только "раздувается". Перезагрузили 100 раз модуль - будет для него 100 дескрипторов. Отличить дескрипторы выгруженных модулей можно по счётчику ссылок импорта от других модулей ref < 0.
Для выгружаемого модуля уничтожаются секции кода и глобальных переменных (code и data). Блок метаинформации остаётся, как есть.
Спасибо.

А делать-то что?

Автор:  Trurl [ Среда, 07 Декабрь, 2011 15:36 ]
Заголовок сообщения:  Re: дескрипторы типов не выгружаются с модулем -> утечка пам

Илья Ермаков писал(а):
Для выгружаемого модуля уничтожаются секции кода и глобальных переменных (code и data).

Легко убедиться, что это не так.
1-й способ: посмотреть исходники Kernel.
2-й способ: экспериментальный
Код:
MODULE TestArr;
VAR a:ARRAY 10000000 OF INTEGER;
 PROCEDURE Do*;
 BEGIN
   
 END Do;
END TestArr.
Ctrl+click(?)TestArr.Do

Сколько раз у вас получится перезагрузить этот модуль?

Автор:  Trurl [ Среда, 07 Декабрь, 2011 15:39 ]
Заголовок сообщения:  Re: дескрипторы типов не выгружаются с модулем -> утечка пам

Info21 писал(а):
Грузить независимый ББ для каждой задачки?

Наверное, так. Дети - они такие затейники.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/