Большие пробелы в куче поколения # 0 - PullRequest
0 голосов
/ 02 мая 2018

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

Вот скриншот родной памяти приложения (сделанный с помощью профилировщика памяти .NET):

enter image description here

Приложение занимает около 2,2 ГБ (что нормально). Дамп был взят, когда у приложения было около 3,5 ГБ. И эти пробелы в поколении № 0 - это то, что я сейчас не могу объяснить. Мне кажется, сборщик мусора не сокращает пробелы в поколении № 0.

Чтобы задать один четкий вопрос:

  • Как возникают такие разрывы? Мне кажется, что сборщик мусора собирал мертвые объекты, но не уплотнял кучу. Я знаю, что не могу вызвать или заставить GC сжать кучу.

Я искал на этом сайте похожие вопросы, но большинство из них касаются LOH (что в моем случае кажется нормальным). Единственный вопрос, который имеет какие-то похожие большие пробелы, заключается в следующем: Что такое отверстия GC , но я не вижу, как 2 КБ закрепленных экземпляров поколения # 0 приводят к отверстиям размером 1 ГБ. Другой вопрос касается порога срабатывания GC Пороги GC . Но я не могу поверить, что не было ни одной фазы уплотнения.

1 Ответ

0 голосов
/ 02 мая 2018

Отверстия / пробелы представляют память, которая не используется между двумя выделенными экземплярами. «Отверстия» появляются, когда куча не полностью уплотнена (из-за закрепленных экземпляров или оптимизации в сборщике мусора).

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

Итак, у вас есть пробелы, что это значит? Это означает, что выделять кучу становится сложнее, что с этим поделать ... не так много. если это проблема с производительностью, вы можете немного поиграть с GC. Однако, если вы используете много закрепленной памяти, вы мало что можете сделать. Это называется фрагментация

Дополнительные ресурсы

Основы сборщика мусора и советы по производительности

Что такое отверстия ГХ?

GC поведение при закреплении объекта

Что вызывает фрагментацию памяти в .NET

Больше нет фрагментации памяти в куче больших объектов .NET

...