Приветствую! Ситуация такая:
Есть 2 сервера, на каждом крутится по JBoss'у 4.2. На каждом JBoss'е вертится по приложению (пусть будут А и Б). Приложение А ходит к Б по EJB. Всё работает как надо.
Однако есть проблема:
У первого JBoss'а постепенно растёт время выполнения GC для young generation. Вскоре после запуска это время составляет 0.1 секунды, а через три дня уже 1.1 секунды. В результате чего растет нагрузка на сервер и уменьшается пропускная способность приложения. О настройках:
Используется -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:NewSize=1024M -XX:MaxNewSize=1024M
При этом на JBoss'е с приложением Б всё хорошо.
Есть подозрение, что такой рост вызван тем, что А подключено к Б, т.к. подобная ситуация повторялась и на других JBoss'ах и приложениях.
Подскажите, пожалуйста, из-за чего могут расти эти паузы?
Э-м-м… почему такой большой размер YoungGen? На то и нужен generational GC, чтоб молодое поколение было маленьким и быстрым. Какой общий размер Java Heap?
Для максимизации пропускной способности ParallelGC лучше.
Похоже на утечку памяти в самом приложении. Есть возможность запустить с -Xloggc:gc.log -XX:+PrintGC [-XX:+PrintGCDetails -XX:+Verbose]?
Общий размер Java Heap 5Gb (-Xms5120m -Xmx5120m)
такой большой размер YoungGen? — заполняется за ~ 15 секунд. (причем промежутки времени не зависят от срока работы Jboss, что после запуска, что после 3-х дней промежутки равные, а паузы становятся больше)
А чем ParallelGC лучше ParNewGC?
Вообще, вот все опции, с которыми запущен JBoss:
JAVA_OPTS="-server -Xms5120m -Xmx5120m -Xss128k -XX:PermSize=256M -XX:MaxPermSize=256M -XX:NewSize=1024M -XX:MaxNewSize=1024M -XX:SurvivorRatio=6 -XX:TargetSurvivorRatio=95 -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -verbose:gc -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -Xloggc:$LOG_JBOSS_GC".
Утечка памяти вроде может влиять на частоту GC, но не на их продолжительность? Или нет?
Ага, GC log у вас уже собирается в $LOG_JBOSS_GC. Можно взглянуть?
Помню, был давно (по крайней мере, в пятерке) баг в ParNewGC с симптомами, похожими на ваши. Как вариант, все-таки попробовать ParallelGC, если на сервере больше 2х процессоров. Кстати, сколько?
Достаточно -XX:+CMSClassUnloadingEnabled. Для примера - в проекте используется JS или Groovy интерпритаторы, а эти ребята любят делать много анонимных классов в рантайме.