Сколько дополнительной памяти требуется для сборки мусора? - PullRequest
13 голосов
/ 31 января 2011

Однажды я услышал, что для того, чтобы язык правильно реализовал и запустил сборку мусора правильно , в среднем требуется в 3 раза больше памяти.Я не уверен, если это предполагает, что приложение маленькое, большое или одно из них.

Так что я хотел бы знать, есть ли какое-либо исследование или фактически количество накладных расходов на сборку мусора.Также я хочу сказать, что GC - очень хорошая особенность.

Ответы [ 4 ]

8 голосов
/ 31 января 2011

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

Другой фактор - время жизни объекта.Если ваши объекты обычно имеют очень короткий срок службы, то вы можете справиться с немного меньшим запасом времени с помощью коллектора поколений.

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

Редактировать (январь 2011 г.):

Я думал о конкретной статье, которую, похоже, не могу найтипрямо сейчас.Те, что ниже, интересны и содержат некоторые важные данные о производительности.Как правило, у вас, как правило, все в порядке примерно с вдвое большим объемом доступной памяти, чем у вашей резидентной программы.Некоторым программам нужно больше, но другие программы будут работать очень хорошо даже в стесненных условиях.Есть много переменных, которые влияют на это, но скорость выделения является наиболее важной.

  1. Immix: сборщик мусора в области меток с эффективным использованием пространства, быстрым сбором и мутаторомпроизводительность

  2. Мифы и реальность: влияние на производительность сборки мусора

    Редактировать (февраль 2013 г.): Это изменение добавляетсбалансированный подход к цитируемой статье, а также устранение возражений, высказанных Тимом Купером.

  3. Количественная оценка производительности сборки мусора и явного управления памятью ,как отметил Натан Йеллин, на самом деле это ссылка, которую я впервые пытался вспомнить еще в январе 2011 года. Однако я не думаю, что интерпретация, предложенная Натаном, верна.Это исследование не сравнивает GC с обычным ручным управлением памятью.Скорее он сравнивает GC с оракулом, который делает совершенные явные выпуски.Другими словами, это заставляет нас не знать, насколько хорошо обычное ручное управление памятью по сравнению с волшебным оракулом.Это также очень трудно выяснить, потому что исходные программы написаны либо для GC, либо для ручного управления памятью.Таким образом, любой эталонный тест сохраняет присущую ему предвзятость.

Следуя возражениям Тима Купера, я хотел бы прояснить свою позицию по вопросу о запасе памяти.Я делаю это главным образом для потомков, так как я считаю, что ответы переполнения стека должны служить многолетним долгосрочным ресурсом.

В типичной системе GC много областей памяти, но есть три абстрактных вида:

  • Выделенное пространство (содержит живые, мертвые и неотслеживаемые объекты)
  • Зарезервированное пространство (из которого выделяются новые объекты)
  • Рабочая область (долгосрочная и краткосрочнаятермин GC структуры данных)

Что такое запас в любом случае?Запас хода - это минимальный объем зарезервированного пространства, необходимого для поддержания желаемого уровня производительности. Я полагаю, что именно об этом спрашивал ОП. Вы также можете думать о запасе памяти как о памяти, необходимой для фактического резидентного расположения программы (максимальной оперативной памяти), необходимой для хорошей производительности.

Да -- увеличение запаса может задержать сборку мусора и увеличить пропускную способность.Это важно для автономных некритических операций.

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

  • для жесткого реального времени - наихудшая задержка (для критически важных систем) - поздний ответ от распределителя является ошибкой.
  • soft-realtime относится к средней или средней задержке - поздний ответ от распределителя в порядке, но не должен происходить часто.

Большинство современных сборщиков мусора нацелены на программный режим реального времени, который хорош как для настольных приложений, так и для серверов, которые предоставляют услуги по требованию.Если кто-то исключает реальное время как требование, он также может использовать сборщик мусора «останови мир», в котором запас начинает терять смысл.(Примечание: приложения с преимущественно недолговечными объектами и высокой скоростью выделения могут быть исключением из-за низкой выживаемости.)

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

  • средняя резидентность: 1000 КБ
  • зарезервированный запас: 100 КБ
  • Продолжительность цикла ГХ: 1000 мс

А:

  • скорость выделения A: 100 КБ / с
  • скорость выделения B: 200 КБ / с

Теперь мы можемсм. следующую временную шкалу событий со скоростью распределения A:

  • T + 0000 мс: цикл GC начинается, 100 КБ доступно для распределений, 1000 КБ уже выделено
  • T + 1000 мс:
    • 0 КБ свободного места в зарезервированном пространстве, 1100 КБ выделено
    • цикл GC завершен, освобождено 100 КБ
    • 100 КБ свободно в резерве, 1000 КБ выделено
  • T + 2000 мс: то же, что и выше

Временная шкала событий со скоростью выделения B отличается:

  • T + 0000 мс: цикл GCзапускается, 100 КБ доступно для выделения, 1000 КБ уже выделено
  • T + 0500 мс:
    • 0 КБ свободно в зарезервированном пространстве, 1100 КБ выделено
    • либо
      • задержка до конца цикла GC (плохая, но иногда обязательная), либо
      • увеличение зарезервированного размера до 200 КБ со свободными 100 КБ (предполагается здесь)
  • T + 1000 мс:
    • 0 КБ свободно в зарезервированном пространстве, выделено 1200 КБ
    • цикл GC завершен, выпущено 200 КБ
    • 200 КБ свободно в резерве, 1000 КБ выделено
  • T + 2000 мс:
    • 0 КБ свободно в зарезервированном пространстве, 1200 КБ выделено
    • Цикл GC завершен, выпущено 200 КБ
    • 200 КБ, свободен в резерве, выделено 1000 КБ

Обратите внимание, как скорость распределения напрямую влияет на размер запасатребуется?При уровне распределения B нам требуется вдвое больше запаса для предотвращения пауз и поддержания того же уровня производительности.

Это был очень упрощенный пример, предназначенный для иллюстрации только одной идеи. Есть много других факторов, но это показывает, что было задумано.Имейте в виду другой важный фактор, который я упомянул: среднее время жизни объекта.Короткое время жизни приводит к тому, что низкие показатели выживаемости, которые работают вместе со скоростью выделения, влияют на объем памяти, необходимый для поддержания заданного уровня производительности.

Короче говоря, нельзя делать общие заявления о требуемом запасе, не зная ипонимание характеристик приложения.

4 голосов
/ 27 июня 2011

Согласно исследованию 2005 года Количественная оценка производительности сборки мусора и явное управление памятью (PDF) , поколения сборщиков мусора требуется в 5 раз больше памяти для достижения равной производительности. Упор ниже мой:

Мы сравниваем явное управление памятью с копирующими и не копирующими сборщиками мусора по целому ряду тестов и включаем реальные (не имитированные) прогоны, которые проверяют наши результаты. Эти результаты определяют количественно-пространственный компромисс между сборкой мусора: с пятикратным увеличением объема памяти, сборщик мусора поколения Appel-стиля с незрелым пространством для копирования соответствует производительности явного управления памятью. В два раза больше памяти, он работает в среднем на 17% медленнее, чем явное управление памятью. Тем не менее, с только вдвое больше памяти, сборка мусора снижает производительность почти на 70%. Когда физической памяти недостаточно, подкачка страниц вызывает сборку мусора на порядок медленнее, чем явное управление памятью.

3 голосов
/ 29 декабря 2012

Так что я хотел бы знать, есть ли какие-либо исследования или на самом деле количество накладных расходов на сборку мусора.

Почти 10 лет назад я изучал две эквивалентные программы, написанные на C ++ с использованием STL (GCC на Linux) и в OCaml с использованием сборщика мусора. Я обнаружил, что C ++ использует в 2 раза больше памяти в среднем. Я пытался улучшить его, написав пользовательские STL-распределители, но так и не смог сравниться с объемом памяти OCaml.

Кроме того, GC обычно много уплотняют, что еще больше уменьшает объем памяти. Таким образом, я бы оспорил предположение о том, что по сравнению с обычным неуправляемым кодом возникают накладные расходы памяти (например, C ++ использует те, что сейчас являются стандартными коллекциями библиотек).

3 голосов
/ 31 января 2011

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

Накладные расходы, безусловно, зависят от многих факторов;например, накладные расходы больше, если вы запускаете сборщик мусора реже;копирующий сборщик мусора имеет более высокие издержки, чем сборщик меток и разверток;и гораздо проще написать сборщик мусора с меньшими издержками в однопоточном приложении, чем в многопоточном мире, особенно для всего, что перемещает объекты (копирование и / или сжатие gc).

...