2014-01-30 6 views
1

В текущем приложении, основанном на BPM (развернутом в JBOSS AS 4.2.3), наблюдается некоторые проблемы с производительностью, что связано с некоторыми более длительными циклами подвески GC во время пиковой нагрузки. Анализируя больше в том же, я нашел следующий вывод для утилиты jstat для запуска экземпляра JVM.Исследование цикла сбора мусора вызывает

/usr/jdk1.6.0-x64/bin/jstat -gccapacity 5583 NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN PGCMX PGC PC YGC ФСК 838848,0 1677696,0 1677696,0 167744,0 167744,0 1342208,0 3355456,0 6710912,0 6710912,0 6710912,0 21248,0 524288,0 480084,0 480084,0 8448 268

/usr/jdk1.6.0-x64/bin/jstat -gcutil 5583 1s S0 S1 ИАП YGC YGCT ФСК FGCT GCT 0,00 46,33 23,11 81,23 60,38 8451 1386,335 268 159,553 1545,887 0,00 46,33 27,99 81,23 60,38 8451 1386,335 268 159,553 1545,887

В первой команде (с опцией -gccapacity) я заметил, что NGC = NGCMX и OGC = OGCMX. Это означает, что текущая способность старого поколения достигает максимальной способности старого поколения, а нынешняя новая гене-способность достигает максимальной способности нового поколения.

Я хотел бы понять, может быть, это может быть причиной частых циклов GC с некоторыми большими казнями (иногда занимает более 25-30 секунд)?

Для текущего разрешения мы увеличили память кучи Max JVM с 8 ГБ до 9 ГБ. Однако нам нужно понять возможные причины, так что мы можем поднять то же самое в команде разработчиков, чтобы оптимизировать приложения.

ответ

2

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

Увеличение с 8 до 9 ГБ вряд ли может иметь большое значение. Если у вас есть память, попробуйте использовать 16 ГБ или 30 ГБ и посмотрите, нужно ли это больше, чем вам нужно, а затем уменьшите ее.

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

+0

+1 JVisualVM - это хорошо. И есть функция для удаленного профилирования. Используя профилировщик, вы можете найти утечки внутри приложения. – edubriguenti

+0

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

+0

Спасибо Петру за ответ. Я попробую jmap -histo, чтобы больше узнать причину, а также посмотреть, есть ли какие-либо инструменты, которые я могу использовать, как вам было предложено. Однако я хотел бы понять, если NGC = NGCMX и OGC = OGCMX (как и в моем случае), это вопрос, вызывающий озабоченность и увеличение объема памяти, вероятно, приведет к снижению NGC и OGC меньше значений NGCMX и OGCMX? Примечание. У меня есть эти значения с исполнением jstat -gccapacity . – dash27

0

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

Алгоритм Параллельный Коллектор (вы можете включить это с помощью -XX: + UseParallelGC) может работать незначительные собирает параллельно. Предупреждение: этот алгоритм является «стоп-миром», но может использовать несколько процессоров для выполнения GC.

Есть также -XX: + UseParallelOldGC, которые позволяют сборщику для старого GEN.

Эти альгортмы меняются от виртуальной машины к другой. Посмотрите, какую версию JVM вы используете, и попытайтесь выбрать правильный алгоритм для ваших нужд.

Как сказал Питер в своем ответе, профилировщик поможет вам оценить ваше приложение, выбранный алгоритм GC и принять ваше решение.

+0

Большое спасибо за ответ, посмотрим, может ли это быть любым решением существующей проблемы. – dash27

Смежные вопросы