Сборка мусора Java останавливает все процессы Java - PullRequest
7 голосов
/ 23 февраля 2012

Мы запускаем несколько экземпляров серверного процесса на одном компьютере с Linux. Коробка имеет 8 ядер и 16 ГБ оперативной памяти. Я запускаю каждый процесс с опцией -Xincgc, используя Java 1.6.

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

Это не останавливается в течение долгого времени, может быть, 100-300 мс или около того, но задержка является огромным фактором для этого. Это также не останавливается постоянно, просто периодически.

Когда происходит сборка мусора, это останавливает какой-либо процесс Java в любое время? Если так, есть ли способ обойти это? Должен ли я использовать другие параметры GC?

UPDATE:

Просто чтобы прояснить, я не беспокоюсь о том, что один процесс остановится, пока происходит GC. Я могу настроить параметры или оптимизировать для этого случая. Мне просто интересно, почему КАЖДЫЙ запущенный Java-процесс останавливается одновременно, когда я думал, что они более или менее независимы.

Ответы [ 4 ]

3 голосов
/ 23 февраля 2012

при использовании -Xincgc, согласно этой документации Sun

Параллельный коллектор с низкой паузой: этот коллектор используется, если в командной строке передано -Xincgc ™ или -XX:+UseConcMarkSweepGC. Параллельный сборщик используется для сбора заемного поколения и выполняет большую часть сбора одновременно с выполнением приложения. Приложение приостанавливается на короткие периоды во время сбора .

Возможно, вам понадобится рассмотреть другие альтернативы, такие как Throughput Collector. Выше документации есть хорошее описание того, когда, какой сборщик будет полезен.

3 голосов
/ 23 февраля 2012

Java v 1.6 должна быть умной и определять, какой тип GC лучше.

Я бы порекомендовал прочитать это: Сборка мусора в Java 6

Сводка: попробуйте любой из этих (но не оба):

  • -XX: + UseParallelGC
  • -XX: + ExplicitGCInvokesConcurren
2 голосов
/ 23 февраля 2012

Проблема, с которой вы сталкиваетесь, - это «Полная сборка мусора», также известная как «Остановите мир, GC».Когда это происходит, приложение Java перестает работать.Проверьте эту ветку на наличие указателей:

Настройка сборки мусора для малой задержки

0 голосов
/ 23 февраля 2012

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

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...