Мы запускаем несколько экземпляров серверного процесса в одном Linux-окне. Коробка имеет 8 ядер и 16 гб оперативной памяти. Я запускаю каждый процесс с помощью опции -Xincgc, используя Java 1.6.Java Garbage Collection закрывает все процессы Java
У нас есть различные таймеры, используемые во всем приложении, которые отслеживают время для выполнения различных задач. Когда происходит сбор мусора, я замечаю, что каждый процесс java на коробке печатает, что любая задача, которую он выполнял в то время, была медленной.
Это не застопоривание в течение длительного времени, может быть, 100-300 мс или около того, но латентность является огромным фактором для этого. Он также не останавливается постоянно, просто периодически.
Когда сборка мусора происходит, она не позволяет любому процессу java получить какое-либо время? Если да, есть ли способ обойти это? Должен ли я использовать разные опции GC?
UPDATE:
Просто чтобы быть ясно, я не волнуюсь по поводу одного процесса глушения в то время как GC происходит. Я могу настроить настройки или оптимизировать для этого случая. Мне просто интересно, почему КАЖДЫЙ запущенный Java-процесс, похоже, заглох в то же самое время, когда я думал, что они более или менее независимы.
GC не должен действительно тормозить все процессы. Кроме того, вы должны прочитать [GC tuning guide] (http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html). Сборщик мусора по умолчанию для Java 6 должен быть параллельным GC, который оптимизирован для пропускной способности, а не для паузы. Совместный сборщик может быть лучше подходит. – millimoose
Возможно, вам захочется рассмотреть возможность объединения объектов. Это будет одним из способов уменьшить количество GC, которое происходит. –
@ Гарантировано: вы работаете с независимыми JVM, и когда одна JVM выполняет полный GC, каждая отдельная JVM затронута? Это то, что вы описываете? – TacticalCoder