Есть ли способ собирать ссылки на объекты в куче определенного типа?

#.net #garbage-collection #heap-memory

#.net #сбор мусора #куча-память

Вопрос:

(Краткая версия.)

Есть ли способ, которым мой код на C # может получить доступ к коллекции объектов в управляемой куче, не сохраняя мою собственную коллекцию ссылок?

(Длинная версия.)

Я написал неизменяемый класс объектов. Во время профилирования я обнаружил, что мой код создал много повторяющихся объектов. Отдельные экземпляры моего класса, но хранящие одно и то же содержимое.

Чтобы уменьшить нагрузку на хранение всех этих дубликатов, я воспользовался советом String класса и подумал о написании собственного Intern объекта. Таким образом, прежде чем экземпляр будет взят в коллекцию для долгосрочного хранения, я бы сначала проверил пул значений и посмотрел, есть ли эквивалентный объект уже в пуле, и если да, вернул объединенную ссылку, чтобы заменить предоставленную ссылку, которую можно быстро удалить.

Я подумал о том, как это будет работать, и представил себе коллекцию WeakReference оболочек для хранения объединенных ссылок. Именно в этот момент я понял, что мой код будет хранить избыточную коллекцию объектов. Диспетчер кучи в dot-net уже отслеживает все объекты, чтобы позволить GC работать.

Поэтому вместо того, чтобы поддерживать пул, могу ли я попросить менеджера кучи dot-net предоставить мне коллекцию ссылок на все экземпляры определенного типа в куче?

Комментарии:

1. Короткий ответ: нет. (По крайней мере, не без участия в API-интерфейсах профилирования и т. Д.)

2. Система не поддерживает активно коллекцию ссылок. Этап маркировки GC заключается в следовании ссылкам из набора корней.

3. Долгое @JonSkeet ответ: «nooooooooooooooooooooooooooooooooooooooooooo»