Моим первым шагом было бы установить, является ли это подлинной утечкой памяти или нет.
Все вопросы, поднятые в предыдущих ответах, относятся к скорости , на которой собираются объекты, а не к вопросу о том, собраны ли ваши объекты вообще. Только последняя является настоящей утечкой памяти.
У нас было похожее затруднение в моем проекте, и мы запустили приложение в режиме «замедленного движения», чтобы выяснить, была ли у нас настоящая утечка. Мы смогли сделать это, замедлив поток входных данных.
Если проблема исчезает при запуске в режиме «замедленного движения», то проблема, вероятно, одна из тех, которые были предложены в предыдущих ответах, т. Е. Поток Finalizer не может обработать очередь финализатора достаточно быстро.
Если это проблема, может показаться, что вам может потребоваться выполнить нетривиальный рефакторинг, как описано на странице Bringer128, связанной, например, с.
Теперь давайте посмотрим, как писать классы, которые требуют посмертной очистки, чтобы их пользователи не сталкивались с ранее описанными проблемами. Лучший способ сделать это - разделить такие классы на два - один для хранения данных, которые требуют посмертной очистки, другой для хранения всего остального - и определения финализатора только для первого