2012-02-23 3 views
6

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

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

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

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

UPDATE:

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

+0

GC не должен действительно тормозить все процессы. Кроме того, вы должны прочитать [GC tuning guide] (http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html). Сборщик мусора по умолчанию для Java 6 должен быть параллельным GC, который оптимизирован для пропускной способности, а не для паузы. Совместный сборщик может быть лучше подходит. – millimoose

+0

Возможно, вам захочется рассмотреть возможность объединения объектов. Это будет одним из способов уменьшить количество GC, которое происходит. –

+1

@ Гарантировано: вы работаете с независимыми JVM, и когда одна JVM выполняет полный GC, каждая отдельная JVM затронута? Это то, что вы описываете? – TacticalCoder

ответ

0

GC latency - одна из проблем, присущих сборщикам мусора, таким как Java. Это одна из причин того, что высокоскоростные системы, такие как системы торговли акциями, написаны на C++, а не на Java или C#. 100 мс звучит правильно для большой операции GC.

+2

Как это отвечает на вопрос? Все это говорит о том, что да, то, что описал ОП, на самом деле происходит; мы это уже знаем. – millimoose

+0

Я считаю, что вопрос касался нескольких процессов * одновременно с остановкой. – delnan

+0

@Mike Thomsen: высокочастотные торговые альго, написанные на C++? Pfft ... Это так ssllooww! Теперь это прямое описание аппаратного языка/FPGA! ;) – TacticalCoder

0

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

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

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

3

при использовании -Xincgc, в соответствии с настоящим sun documentation

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

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

+0

Если я прочитал это право на документацию, сборщик пропускной способности еще менее подходит для требования низкой паузы - ВСЕ коллекторы будут иногда останавливаться, они просто отличаются тем, сколько времени будет каждая пауза, и сколько общего времени выполнения будет потрачено на паузы. AFAIK, сборщик пропускной способности будет иметь более длительные индивидуальные паузы, но в конечном итоге они занимают меньше времени. У инкрементального коллектора будет более короткая пауза, которая добавит больше времени, затраченного на остановку. – millimoose

+0

Кроме того, руководство, к которому вы привязаны, предназначено для Java 5.0. Какие сборщики мусора доступны/выбраны по умолчанию, это одна вещь, которая изменяется между выпусками HotSpot VM, поэтому вы обязательно должны использовать самую актуальную соответствующую документацию, когда будете говорить о них. – millimoose

3

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

Я рекомендовал бы читать это: Garbage collection in Java 6

Резюме: попробовать любой из них (но не оба):

  • -XX: + UseParallelGC
  • -XX: + ExplicitGCInvokesConcurren
2

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

Tuning garbage collections for low latency

+0

Основываясь на журналах GC, полных коллекций не происходит. – Guaranteed