Частое появление FULL GC
В нашей системе часто встречается FULL GC. Мы используем приложение Java, работающее на сервере Tomcat. Наше приложение работает с внутренней настройкой балансировки нагрузки. В журналах сервера мы видим много Full GC, из-за чего приложение зависает и возникают ошибки прокси.
Значения параметров Java, которые мы используем: Webapp обертка: wrapper.java.additional.4=-Xms382M wrapper.java.additional.5=-Xmx1024M Обертка Backapp: wrapper.java.additional.4 = -Xms382M wrapper.java.additional 0,5 = -Xmx1024M
Обнаружена ошибка в журналах оболочки webapp: INFO | JVM 1 | 2010/11/26 09:33:19 | [PSYoungGen: 1398460K->140291K(1514624K)] 4623364K->3491394K(5009920K), 0,7285303 секунды] [Times: user=1.42 sys=0.00, real=0.72 sec] INFO | JVM 1 | 2010/11/26 09:33:19 | 68539.126: [Полный GC DEBUG | обертка | 2010/11/26 09:33:19 | отправить пакет PING: ping
Попытался изменить значения JVM, чтобы увеличить размер кучи. Но бесполезно. Я подозреваю, что может быть какая-то другая причина кроме этих параметров, которая вызывает проблему.
Может кто-нибудь, пожалуйста, помогите мне в этом?
2 ответа
Добавьте этот параметр в ваш setDomainEnv.sh: -XX:+DisableExplicitGC
Перезагрузите ваши серверы. Это позволит избежать любых явных GC, которые могут быть вызваны приложением, и позволит JVM принимать внутренние решения и запускать полный GC там, где это действительно необходимо.
Добавьте это к вашему java_opts: "-XX:+UseConcMarkSweepGC" Это многопоточный GC, который работает намного лучше при высокой нагрузке.
Полный сборщик мусора является важным событием в процессе сбора мусора. Во время этой полной фазы GC мусор собирается из всех областей в куче JVM (Young, Old, Perm, Metaspace). Full GC имеет тенденцию извлекать больше объектов из памяти, так как он работает во всех поколениях. Событие Full GC имеет несколько этапов. Некоторые фазы события Full GC (такие как 'initial-mark', 'notes', 'cleanup',..) приостанавливают все потоки приложения, в которых выполняется JVM. В течение этого периода транзакции клиентов не будут обрабатываться. JVM будет использовать все циклы ЦП для сбора мусора. Благодаря этому потребление процессора будет довольно высоким. Таким образом, в целом полные GC не желательны. Нет необходимости спрашивать о желательности последовательных полных сборок мусора. Последовательные полные сборы мусора вызовут следующие проблемы:
- Потребление процессора увеличится.
- Поскольку JVM приостановлена, время отклика транзакций вашего приложения будет ухудшаться. Таким образом, это повлияет на ваши SLA и ухудшит качество обслуживания клиентов.