Задать вопрос
Priest512
@Priest512
Разработчик .NET, С++

Как «закрепить объект» в куче?

Имеется коллекция элементов, которая может часто обновляться и она постоянно увеличивается в размере. Читал Рихтера, возник вопрос, как объект сделать непереносимым в куче и есть ли возможность сразу отнести его ко 2 поколению? Или избегать его обработки сборщиком мусора? Коллекция как источник новостной ленты.
  • Вопрос задан
  • 2494 просмотра
Подписаться 1 Оценить 5 комментариев
Решения вопроса 1
Вы Рихтера внимательно читали?
Второе поколение - это большие объекты ( конкретный размер зависит от ПК), сразу 2-е поколение.
Объект можно застолбить за определенным адресом в памяти, и об этом тоже написано в книге.
Точно не помню но вроде volatile не только делает объект потоко безопасным, но еще и запрещает компилятору оптимизировать участок кода. (прочитайте еще раз).

Повторял заметки, вот ответ:
Мониторинг и управление сборщиком мусора на объекте.
Вызываем статический метод Alloc объекта GCHandle, передаем ссылку на объект и тип GCHandleType в котором:
1) Weak - мониториг, обнаруживаем что объект более не доступен, финализатор мог выполниться.
2) WeakTrackResurrection - мониторинг, обнаруживаем что объект более не доступен, финализатор точно был выполнен (при его наличии).
3) Normal - контроль, заставляет оставить объект в памяти, память занятая этим объектом может быть сжата.
4) Pinned - контроль, заставляет оставить объект в памяти, память занятая этим объектом не может быть сжата (т.е. перемещена).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@smozhaykin
Если хотите, чтобы при инкрементальной загрузке освобождалась неиспользуемая память, посмотрите в сторону виртуализации. Ссылки давал тут
Ответ написан
@CrazyHorse
"и есть ли возможность сразу отнести его ко 2 поколению?" как говорится это дурно попахивает и в перспективе ведет к проблемам с производительностью.

Для того чтобы сборщик мусора не трогал Вашу коллекцию, она может быть например статической, но это ни в коем случае не значит что так надо делать.

"Коллекция как источник новостной ленты." - если это веб приложение то не вижу проблем в создании каждый раз этой коллекции на основании запроса к базе данных - на странице то у Вас как правило -10-20 новостей выводится от силы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы