G1GC: как использовать всю свободную память?

Я пытаюсь использовать G1GC с моей программой. Программа используется на разных компьютерах с различным объемом памяти: VPS с 1 ГБ памяти (минимум), рабочий стол с 8 ГБ памяти, DS с 32 ГБ памяти (максимум). Я заметил, что G1GC не резервирует больше памяти, даже если есть много свободной памяти (например, G1GC не резервирует больше, чем 3 ГБ на моей машине с общим объемом 8 ГБ / 4 ГБ)

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

1 ответ

Решение

Я думаю, что вы выбрали неправильный алгоритм сбора мусора. Документация по Java 8 предлагает следующее руководство:

Выбор коллекционера

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

  • Если приложение имеет небольшой набор данных (примерно до 100 МБ), выберите последовательный коллектор с параметром -XX:+UseSerialGC,

  • Если приложение будет запущено на одном процессоре и нет требований к времени паузы, то позвольте виртуальной машине выбрать коллектор или выберите последовательный коллектор с опцией -XX:+UseSerialGC,

  • Если (а) пиковая производительность приложения является первым приоритетом и (б) нет требований к времени паузы или допустимы паузы в 1 секунду или более, то позвольте виртуальной машине выбрать коллектор или выбрать параллельный коллектор с помощью -XX:+UseParallelGC,

  • Если время отклика важнее, чем общая пропускная способность, и паузы при сборке мусора должны быть короче, чем примерно 1 секунда, выберите параллельный сборщик с помощью -XX:+UseConcMarkSweepGC или же -XX:+UseG1GC,

Источник: Выбор коллекционера

Судя по вашим комментариям, ваша цель - добиться максимальной производительности; т.е. минимизировать общее время, затрачиваемое на сборку мусора и связанные с этим накладные расходы.

Это означает, что ваши лучшие варианты:

  • Установите некоторые цели производительности и позвольте JVM решить, какой сборщик лучше. Посмотрите материал по настройке поведения для деталей о механизмах достижения производительности.
  • Выберите Serial GC, если у вас есть только одно ядро.
  • Выберите Parallel GC, если у вас более одного ядра.

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

Другие вопросы по тегам