Назад | Перейти на главную страницу

Настройка сборки мусора в Apache Tomcat

У меня есть следующие параметры в tomcat6.conf

JAVA_OPTS="-server -Xmx6144m -Xms3072m -XX:+UseConcMarkSweepGC -XX:MaxGCPauseMillis=999 -XX:ReservedCodeCacheSize=128m -XX:MaxPermSize=256m -Djava.awt.headless=true -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname= -Djava.rmi.server.useLocalHostname=false" 

но в часы пик я регулярно вижу следующее:

ERROR memory-watcher - used 87.73865761212004%, max 6403194880 reaping at priority CRITICAL

Есть ли какой-либо параметр, который я могу использовать для настройки производительности tomcat или GC?

В битах «-Xms3072m» и «-Xmx6144m» вы настраиваете начальный размер кучи и максимальную кучу соответственно.

Это отличается от битов «-XX: ReservedCodeCacheSize = 128m» и «-XX: MaxPermSize = 256m», в которых вы настраиваете память генерации (где JVM хранит классы, а не кучу, в которой хранятся объекты). Одна вещь, которую я здесь заметил, - это разные размеры. Обычно вы хотите, чтобы это было так же, по загадочным причинам, связанным с минимизацией сборки мусора.

Вы также можете попробовать «-XX: + UseParallelGC» вместо «-XX: + UseConcMarkSweepGC» ... Обычно, если у меня проблемы с одним, то мне больше повезет с другим.

GC - это функция JVM (не относящаяся к tomcat), и ее можно настроить в соответствии с документацией для конкретной разновидности / версии java, которую вы используете. IMO, большинство современных приложений на современной java не должны нуждаться в настройке GC при условии, что вы не делаете что-то вроде голодания JVM для памяти (87% поднимаются). В приведенном вами примере это может быть так же просто, как увеличить объем памяти, доступной JVM. 6 ГБ - это не большой объем памяти в современных вычислительных системах, и вам действительно стоит посмотреть, сколько физической ОЗУ доступно для использования в системе, в которой вы это используете. В большинстве случаев вы можете безопасно использовать половину ОЗУ или более для вашей JVM. Примите во внимание рекомендуемые спецификации для вашей ОС и любых других приложений, работающих на коробке. Любая память, оставшаяся после выполнения этих требований, может и потенциально должна быть предоставлена ​​вашей JVM, чтобы вы не столкнулись с узкими местами в памяти. Особенно, если JVM, с которой вы работаете, является основной функцией выделенного сервера.

-source: я был системным администратором в большой организации со множеством серверов приложений, работающих на java, и я разработчик и пользователь java.