Что именно означает «Указывает на начало сборки мусора управляемой кучи» и так ли это плохо?

Что именно делает

Указывает на начало сборки мусора управляемой кучи.

значит и это плохо?

Во время работы отладчика Visual Studio я просматриваю память процесса, и когда выполняется одна из моих операций, на графике памяти процесса появляется несколько желтых символов, указывающих на то, что число «Указывает на начало сборки мусора управляемой кучи» операции произошли. Код обрабатывается за разумное время, так что это плохо?


person user9964422    schedule 10.07.2018    source источник
comment
Это означает, что сборщик мусора начинает очищать вашу кучу. Наверное, потому что ему нужны новые блоки памяти, которые уже недоступны без удаления мусора. Это само по себе не плохо и не хорошо (ну, скорее хорошо, иначе ваше приложение вылетит с OutOfMemoryException). Это может означать, что вы могли бы лучше организовать свой код, чтобы избежать чрезмерного потребления памяти и фрагментации, но мы не можем сказать, не зная, что делает ваш код и как он делает. что.   -  person René Vogt    schedule 10.07.2018


Ответы (1)


Что означает «Указывает на начало сборки мусора управляемой кучи»?

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

это плохо?

Существует множество различных стратегий сборки мусора в зависимости от того, какую версию среды CLR вы используете и как она настроена. Некоторые из них являются коллекционерами «останови мир»; то есть ваша программа приостанавливается на несколько миллисекунд, пока происходит сбор. Если ваша программа требует обработки событий в реальном или близком к реальному времени с временным бюджетом менее нескольких миллисекунд, сбор данных в неподходящее время может быть очень плохим.

Например, предположим, что вы пишете код для анализа траектории полета приближающейся ракеты, движущейся со скоростью несколько тысяч метров в секунду, и инициирования некоторых контрмер. Если вы ошибетесь на пару миллисекунд из-за того, что не вовремя была произведена сборка мусора, ваш анализ может быть ошибочным на несколько метров, и вы можете промахнуться. Не пишите программное обеспечение для запуска систем перехвата ракет на языке C#. Люди могли умереть. Это действительно плохо.

Например, предположим, что вы пишете игру, которая обновляет экран 60 раз в секунду. Это дает вам менее 17 миллисекунд на обновление для выполнения всех необходимых игровых вычислений. Если это занимает 14 миллисекунд, то сборка мусора может привести к пропуску кадра. Геймеры могут быть раздражены. Это действительно плохо.

Например, предположим, что вы пишете бизнес-программу, которая обновляет базу данных, и обновление базы данных занимает десять секунд. Сборка мусора может прервать это, и тогда это может занять десять секунд плюс три миллисекунды. Это неплохо. Это нормально.

Проанализируйте свое приложение с точки зрения производительности взаимодействия с пользователем, установите бюджет производительности и убедитесь, что благодаря сборке мусора вы не выходите за рамки бюджета. Если у вас нет бюджета на сборку мусора, вам необходимо использовать специальные методы для контроля того, как и когда выполняются сборы, чтобы гарантировать, что они происходят в момент, когда бюджет не выходит за рамки бюджета.

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

Когда мы разрабатывали Roslyn — нынешнее поколение технологии компилятора C#, — нам приходилось очень осторожно справляться с давлением на сбор данных, потому что компилятор делает много-много небольших аллокаций между нажатиями клавиш в редакторе. Были сценарии, в которых мы не получали анализ достаточно быстро, чтобы создать поведение IntelliSense во время ввода из-за нежелательных коллекций. Мы использовали различные методы, чтобы уменьшить как давление, так и объем работы, которую собиратель должен был выполнить для перемещения памяти во время сбора.

Это передовые методы. Если вы находитесь в вашем бюджете, не беспокойтесь о них. Но вы не будете знать, находитесь ли вы в своем бюджете, пока не составите бюджет и не измерите, входите ли вы в него!

person Eric Lippert    schedule 10.07.2018
comment
сейчас операция занимает около 1,7 секунды с довольно большим количеством сборок мусора. Эта продолжительность подходит для моей цели. Теоретически, если бы я хотел уменьшить количество сборок мусора, как бы я это сделал? - person user9964422; 10.07.2018
comment
@ user9964422: Существует множество способов уменьшить количество коллекций. Вот несколько методов, которые я бы попробовал провести эмпирическое исследование: (1) сделать меньше выделений памяти, (2) иметь больше доступной виртуальной памяти, (3) иметь больше доступной физической памяти, (4) выделить не- собранной памяти и управлять ею самостоятельно, (5) использовать объединение и воскрешение объектов для перемещения объектов в кучу gen2, которая собирается реже, (6) выделять из большого пула объектов, который собирается реже, ... и скоро. Вы должны стать экспертом по GC, если хотите пойти по этому пути. - person Eric Lippert; 10.07.2018
comment
@ user9964422: Но этот вопрос не тот вопрос, который нужно задавать в первую очередь. Более частые коллекции, каждая из которых занимает меньше времени, зачастую лучше, чем нечастые дорогие коллекции! Вы должны убедиться, что ваш бюджет соответствует вашему реалистичному пользовательскому сценарию. Заинтересует ли пользователя, если программа в целом станет на 0,1% медленнее? Заинтересует ли пользователя, если программа будет на 0% медленнее большую часть времени, но иногда операция, обычно выполняемая в 1 мс, занимает 10 мс? Это те вопросы, которые вы должны учитывать при оптимизации коллектора. - person Eric Lippert; 10.07.2018
comment
@ user9964422: Прямо сейчас вы не знаете даже основ, чтобы начать делать такую ​​работу, так что сначала изучите это. Статья Рико от 2003 года по-прежнему довольно точна в отношении основ: ">msdn.microsoft.com/en-us/library/ Более свежая статья, описывающая параллельный сборщик, который не останавливает мир, находится здесь: docs.microsoft.com/en-us/dotnet/standard/garbage-collection/ - person Eric Lippert; 10.07.2018
comment
Хорошо, спасибо за вашу помощь. Как вы, наверное, заметили, я новичок в программировании. - person user9964422; 10.07.2018
comment
@user9964422: Сборщик мусора был тщательно разработан таким образом, что для подавляющего большинства реалистичных приложений вам не нужно беспокоиться о нем. В этом весь смысл языков GC, в том, что они освобождают вас от необходимости иметь дело с этим утомительным, подверженным ошибкам аспектом программирования. Если вы разрабатываете приложение, имеющее серьезные реальные потребности в производительности, когда несколько миллисекунд, потраченных не в том месте, могут означать разницу между успехом и неудачей, вам следует побеспокоиться о сборщике мусора. В противном случае позвольте ему делать свою работу; это для вашего удобства. - person Eric Lippert; 10.07.2018
comment
@user9964422: Например, вы, вероятно, не пишете приложение, которое анализирует изменения в программе C#, состоящей из ста тысяч строк, за время между нажатиями клавиш. Используете ли вы редактор с IntelliSense? Если да, то вы используете программу, решающую эту проблему. Нам пришлось побеспокоиться о многих аспектах сборщика и многих других, не связанных с ним проблемах с производительностью, чтобы заставить его работать. Если вам нужно решить такие проблемы, заручитесь услугами специалиста. - person Eric Lippert; 10.07.2018
comment
@ user9964422: Ни в коем случае не ясно, что вы новичок в программировании; многие опытные люди, зарабатывающие на жизнь написанием кода, либо используют только языки без сборщиков, либо никогда даже не задумывались о том, что память нуждается в сборе. - person Eric Lippert; 10.07.2018