#.net #garbage-collection #heap-memory
#.net #сбор мусора #куча-память
Вопрос:
(Краткая версия.)
Есть ли способ, которым мой код на C # может получить доступ к коллекции объектов в управляемой куче, не сохраняя мою собственную коллекцию ссылок?
(Длинная версия.)
Я написал неизменяемый класс объектов. Во время профилирования я обнаружил, что мой код создал много повторяющихся объектов. Отдельные экземпляры моего класса, но хранящие одно и то же содержимое.
Чтобы уменьшить нагрузку на хранение всех этих дубликатов, я воспользовался советом String
класса и подумал о написании собственного Intern
объекта. Таким образом, прежде чем экземпляр будет взят в коллекцию для долгосрочного хранения, я бы сначала проверил пул значений и посмотрел, есть ли эквивалентный объект уже в пуле, и если да, вернул объединенную ссылку, чтобы заменить предоставленную ссылку, которую можно быстро удалить.
Я подумал о том, как это будет работать, и представил себе коллекцию WeakReference
оболочек для хранения объединенных ссылок. Именно в этот момент я понял, что мой код будет хранить избыточную коллекцию объектов. Диспетчер кучи в dot-net уже отслеживает все объекты, чтобы позволить GC работать.
Поэтому вместо того, чтобы поддерживать пул, могу ли я попросить менеджера кучи dot-net предоставить мне коллекцию ссылок на все экземпляры определенного типа в куче?
Комментарии:
1. Короткий ответ: нет. (По крайней мере, не без участия в API-интерфейсах профилирования и т. Д.)
2. Система не поддерживает активно коллекцию ссылок. Этап маркировки GC заключается в следовании ссылкам из набора корней.
3. Долгое @JonSkeet ответ: «nooooooooooooooooooooooooooooooooooooooooooo»