На моей работе мы обсуждаем различные подходы к очистке большого объема управляемой памяти ~ 50-100 МБ. На столе два подхода (читай: два старших разработчика не могут согласиться), и у нас нет опыта остальная часть команды не уверена, какой подход более желателен, производительность или ремонтопригодность.
Собираемые данные представляют собой множество мелких элементов, ~ 30000, которые, в свою очередь, содержат другие элементы, все объекты управляются. Существует много ссылок между этими объектами, включая обработчики событий, но не на внешние объекты. Мы назовем эту большую группу объектов и ссылок как единое целое, называемое blob.
Подход № 1: Убедитесь, что все ссылки на объекты в BLOB-объекте разорваны, и пусть GC обрабатывает BLOB-объект и все соединения.
Подход № 2: Реализуйте IDisposable для этих объектов, затем вызовите dispose для этих объектов и установите ссылки на Nothing и удалите обработчики.
Теория, лежащая в основе второго подхода, заключается в том, что для очистки больших и более длинных объектов в ГХ требуется больше времени. Поэтому, разрезая крупные объекты на кусочки меньшего размера, сборщик мусора будет обрабатывать их быстрее, таким образом повышая производительность.
Поэтому я думаю, что основной вопрос заключается в следующем: оптимизирует ли разделение больших групп взаимосвязанных объектов данные для сбора мусора или лучше объединить их и полагаться на алгоритмы сбора мусора для обработки данных за вас?
Мне кажется, что это случай предварительной оптимизации, но я недостаточно знаю GC, чтобы понять, что помогает или мешает ему.
Редактировать: чтобы добавить акцент, «капля» памяти - это не один большой объект, а множество мелких объектов, выделенных отдельно.
Немного больше информации на случай, если это будет полезно. у нас были «утечки» в том, что объекты не получали GCed. Оба подхода решают проблему утечки, но на данном этапе это спор, который более уместен.