Что означает «Указывает на начало сборки мусора управляемой кучи»?
В CLR есть сборщик мусора. Он отслеживает, сколько памяти используется, и когда его эвристика показывает, что сейчас самое подходящее время, чтобы попытаться восстановить неиспользуемую память, он собирает ненужную память и освобождает ее. При этом он уплотняет кучу.
это плохо?
Существует множество различных стратегий сборки мусора в зависимости от того, какую версию среды CLR вы используете и как она настроена. Некоторые из них являются коллекционерами «останови мир»; то есть ваша программа приостанавливается на несколько миллисекунд, пока происходит сбор. Если ваша программа требует обработки событий в реальном или близком к реальному времени с временным бюджетом менее нескольких миллисекунд, сбор данных в неподходящее время может быть очень плохим.
Например, предположим, что вы пишете код для анализа траектории полета приближающейся ракеты, движущейся со скоростью несколько тысяч метров в секунду, и инициирования некоторых контрмер. Если вы ошибетесь на пару миллисекунд из-за того, что не вовремя была произведена сборка мусора, ваш анализ может быть ошибочным на несколько метров, и вы можете промахнуться. Не пишите программное обеспечение для запуска систем перехвата ракет на языке C#. Люди могли умереть. Это действительно плохо.
Например, предположим, что вы пишете игру, которая обновляет экран 60 раз в секунду. Это дает вам менее 17 миллисекунд на обновление для выполнения всех необходимых игровых вычислений. Если это занимает 14 миллисекунд, то сборка мусора может привести к пропуску кадра. Геймеры могут быть раздражены. Это действительно плохо.
Например, предположим, что вы пишете бизнес-программу, которая обновляет базу данных, и обновление базы данных занимает десять секунд. Сборка мусора может прервать это, и тогда это может занять десять секунд плюс три миллисекунды. Это неплохо. Это нормально.
Проанализируйте свое приложение с точки зрения производительности взаимодействия с пользователем, установите бюджет производительности и убедитесь, что благодаря сборке мусора вы не выходите за рамки бюджета. Если у вас нет бюджета на сборку мусора, вам необходимо использовать специальные методы для контроля того, как и когда выполняются сборы, чтобы гарантировать, что они происходят в момент, когда бюджет не выходит за рамки бюджета.
В частности, если ваш бюджет на сборы исчерпан, вы должны управлять давлением сбора. «Давление» — это эвристика, которую GC использует, чтобы решить, когда собирать; это комбинация того, сколько памяти было выделено недавно, размер выделений, сколько коллекций выжило в памяти и многих других факторов.
Когда мы разрабатывали Roslyn — нынешнее поколение технологии компилятора C#, — нам приходилось очень осторожно справляться с давлением на сбор данных, потому что компилятор делает много-много небольших аллокаций между нажатиями клавиш в редакторе. Были сценарии, в которых мы не получали анализ достаточно быстро, чтобы создать поведение IntelliSense во время ввода из-за нежелательных коллекций. Мы использовали различные методы, чтобы уменьшить как давление, так и объем работы, которую собиратель должен был выполнить для перемещения памяти во время сбора.
Это передовые методы. Если вы находитесь в вашем бюджете, не беспокойтесь о них. Но вы не будете знать, находитесь ли вы в своем бюджете, пока не составите бюджет и не измерите, входите ли вы в него!
person
Eric Lippert
schedule
10.07.2018
OutOfMemoryException
). Это может означать, что вы могли бы лучше организовать свой код, чтобы избежать чрезмерного потребления памяти и фрагментации, но мы не можем сказать, не зная, что делает ваш код и как он делает. что. - person René Vogt   schedule 10.07.2018