Информация об изменениях

Сообщение Сборка мусора. Странное поведение. Утечка. от 13.06.2020 14:35

Изменено 13.06.2020 16:16 igor-booch

Сборка мусора. Странное поведение. Утечка.
В приложении есть класс с финилайзером (КФ).
КФ ссылается на экземпляры класса К1.
Экземпляр класса К2 ссылается на экземпляр класса К1.
Финалайзер КФ убирает ссылку К2 на К1.

При старте приложении создаётся большое количество объетов К2. Они нужны на всём протяжении работы приложения.
Далее происходят циклы:
1) Создаётся большое количество объектов КФ и К1.
2) Ссылки на КФ убираются

После каждого цикла объекты КФ из памяти не выгружаются, их финалайзеры не вызываются.
НО! Если запустить приложении под JetBrains dotMemory Profiler и перед началом циклов нажать на кнопку Force GC,
то УТЕЧКИ НЕ ПРОИСХОДИТ.

Если не нажать, то видно, что все объекты КФ доступны только из f-reacheble queue,
то есть ссылок на них нет, остальсь только вызвать у них финалайзер,
но GC почему-то этого делать не хочет.
Скриншоты с сессиями профилирования здесь.
Сборка мусора. Странное поведение. Утечка.
В приложении есть класс с финилайзером (КФ).
КФ ссылается на экземпляры класса К1.
Экземпляр класса К2 ссылается на экземпляр класса К1.
Финалайзер КФ убирает ссылку К2 на К1.

При старте приложении создаётся большое количество объетов К2. Они нужны на всём протяжении работы приложения.
Далее происходят циклы:
1) Создаётся большое количество объектов КФ и К1.
2) Ссылки на КФ убираются

После каждого цикла объекты КФ из памяти не выгружаются, их финалайзеры не вызываются.
НО! Если перед началом циклов вызвать

GC.Collect();
GC.WaitForPendingFinalizers()


или

GC.WaitForPendingFinalizers()
GC.Collect();


то УТЕЧКИ НЕ ПРОИСХОДИТ.

Если не вызвать этот код, то JetBrains dotMemory Profiler показывает, что все объекты КФ доступны только из f-reacheble queue,
то есть ссылок на них нет, остальсь только вызвать у них финалайзер,
но GC почему-то этого делать не хочет.
Скриншоты с сессиями профилирования здесь.