Ну, это как-то просто: GC запускается время от времени и удаляет мертвые объекты. Объект считается мертвым, когда на него нет живых ссылок. Ссылки на жизнь определяются путем запуска с корней (например, статических переменных, регистров ЦП и т. Д.) И обхода всех объектов. Все объекты, не достигнутые этим, мертвы.
Таким образом, для решения вашей проблемы вы должны использовать профилировщик памяти и проверить, какие объекты находятся в памяти, например, вызванные статическим словарем, который «кэширует» значения и тому подобное.