Как настроить сборщик мусора на Java чаще всего - PullRequest
2 голосов
/ 22 марта 2012

У меня есть сервер, который запускает только некоторые процессы, которые не имеют доступа к пользователю.Поэтому пропускная способность не имеет значения.Большую часть времени сервер выполняет только небольшие задания, поэтому большую часть времени он выполняет незначительные операции.Время от времени появляется большая работа, поэтому для выполнения этого процесса требуется главный управляющий.Я видел случай, как будто никогда не делал крупный сборщик в течение нескольких дней.

Моя проблема в том, что когда основной gc запускается, он останавливается и выдает предупреждение проверки работоспособности.мы попытались уменьшить размер кучи, и проблема исчезла, потому что майор случился чаще.Тем не менее, у него заканчивается память, когда приходит большая работа.Мы не хотим увеличивать тайм-аут проверки работоспособности, чтобы мы хотели настроить gc так, чтобы основной gc происходил чаще, даже с большим размером кучи, вместо ожидания, когда это необходимо.Я планирую перейти на использование -XX:+UseConcMarkSweepGC, чтобы сделать паузу меньшим воздействием.Любые другие варианты JVM я должен попробовать тоже?

Ответы [ 3 ]

1 голос
/ 22 марта 2012

У нас были такие проблемы при использовании опции -XX:+UseParallelGC, но мы обнаружили, что это потому, что соотношение было слишком большим в пользу старых. Это означало, что у нас было большое старое поколение и слишком маленькое новое поколение. Объекты не будут оставаться в новых достаточно долго, чтобы их можно было удалить, поэтому старые будут медленно заполняться, вызывая большой сбор.

Помогло нам установить новый коэффициент выше (-XX:NewRatio=2). Я не могу вспомнить значение, которое мы использовали, но думаю, что это было 2 или 3 - поиграйте с этим.
Это заставляет молодое поколение расти так, что недолговечные объекты могут быть удалены, прежде чем их заставят перейти в старое поколение.

0 голосов
/ 20 августа 2013

Ваша настройка неверна. Вы сказали: пропускная способность не имеет значения, потому что никто не подключается к ней. Это не верно. Когда пользователи подключаются, отзывчивость имеет значение. Когда они этого не делают, пропускная способность имеет значение. Также вы предполагаете, что «нет доступа к пользователю» неверно. У вас есть пользователь, проверяющий здоровье, и которому нужен доступ.

Что я бы порекомендовал для пакетных заданий, так это сохранить оптимизированные для пропускной способности настройки ГХ и работать с более длинными основными ГХ. Возможно, у Healthchecker есть лучшие средства для проверки вашего сервиса, и его можно сделать надежным, чтобы он не упал на GC?

0 голосов
/ 22 марта 2012

Когда «большая работа» становится правильной на некоторых других работах, тогда еще более агрессивный gc также вызовет проверку вашего здоровья.Что я хочу сказать, так это то, что независимо от того, как вы освобождаете память, это проблема синхронизации, и вы можете столкнуться с ней даже при очистке всего сразу после того, как будет выпущена последняя ссылка.Поэтому я бы сказал, что ваша проверка работоспособности настроена слишком конфиденциально.

Тем не менее, вы можете попытаться позвонить System.gc(), когда вы свободны и ваша очередь заданий пуста.Но не рассматривайте это как рекомендацию.Это скорее повредит производительности, чем улучшит ее.

...