Сообщение Сборка мусора. Странное поведение. Утечка. от 13.06.2020 14:35
Изменено 13.06.2020 16:39 igor-booch
Сборка мусора. Странное поведение. Утечка.
В приложении есть класс с финилайзером (КФ).
КФ ссылается на экземпляры класса К1.
Экземпляр класса К2 ссылается на экземпляр класса К1.
Финалайзер КФ убирает ссылку К2 на К1.
При старте приложении создаётся большое количество объетов К2. Они нужны на всём протяжении работы приложения.
Далее происходят циклы:
1) Создаётся большое количество объектов КФ и К1.
2) Ссылки на КФ убираются
После каждого цикла объекты КФ из памяти не выгружаются, их финалайзеры не вызываются.
НО! Если перед началом циклов вызвать
или
то УТЕЧКИ НЕ ПРОИСХОДИТ.
Если не вызвать этот код, то JetBrains dotMemory Profiler показывает, что все объекты КФ доступны только из 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 почему-то этого делать не хочет.
Скриншоты с сессиями профилирования здесь.
Сборка мусора. Странное поведение. Утечка.
В приложении есть класс с финилайзером (КФ).
КФ ссылается на экземпляры класса К1.
Экземпляр класса К2 ссылается на экземпляр класса К1.
Финалайзер КФ убирает ссылку К2 на К1.
При старте приложении создаётся большое количество объетов К2. Они нужны на всём протяжении работы приложения.
Далее происходят циклы:
1) Создаётся большое количество объектов КФ и К1.
2) Ссылки на КФ убираются
После каждого цикла объекты КФ из памяти не выгружаются, их финалайзеры не вызываются.
НО! Если перед началом циклов вызвать
то УТЕЧКИ НЕ ПРОИСХОДИТ.
Если не вызвать этот код, то JetBrains dotMemory Profiler показывает, что все объекты КФ доступны только из f-reacheble queue,
то есть ссылок на них нет, остальсь только вызвать у них финалайзер,
но GC почему-то этого делать не хочет.
Скриншоты с сессиями профилирования здесь.
КФ ссылается на экземпляры класса К1.
Экземпляр класса К2 ссылается на экземпляр класса К1.
Финалайзер КФ убирает ссылку К2 на К1.
При старте приложении создаётся большое количество объетов К2. Они нужны на всём протяжении работы приложения.
Далее происходят циклы:
1) Создаётся большое количество объектов КФ и К1.
2) Ссылки на КФ убираются
После каждого цикла объекты КФ из памяти не выгружаются, их финалайзеры не вызываются.
НО! Если перед началом циклов вызвать
GC.Collect();
то УТЕЧКИ НЕ ПРОИСХОДИТ.
Если не вызвать этот код, то JetBrains dotMemory Profiler показывает, что все объекты КФ доступны только из f-reacheble queue,
то есть ссылок на них нет, остальсь только вызвать у них финалайзер,
но GC почему-то этого делать не хочет.
Скриншоты с сессиями профилирования здесь.