У нас есть веб-приложение под управлением Java 6, Tomcat 6, Spring Framework 3, Hibernate 4, EhCache. У нас возникла проблема с чрезвычайно длинными сроками сбора мусора, которые могут занять 30 секунд или дольше, в результате чего приложение не отвечает.Очень длительное время сбора мусора
В настоящее время мы тестируем, но помимо очевидного: добавьте больше памяти, мне было интересно, есть ли какие-то аспекты, которые мы могли бы настроить, чтобы сократить время сбора мусора.
Основным вкладчиком в использование памяти является EHCache, поскольку мы настойчиво кэшируем. Но мне всегда сложно сортировать магазины EHCache (новые хранилища байтов EhCache, приводят к разным проблемам с нами, потому что графики кэшированных объектов могут быть довольно большими).
Это мои настройки для виртуальной машины Java
JAVA_OPTS="$JAVA_OPTS -server -Xms256m -Xmx704m XX:OnOutOfMemoryError=/usr/share/scripts/on_server_crash.sh -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/tomcat6 -XX:MaxPermSize=192m -XX:+UseConcMarkSweepGC
Получаете ли вы эти долгие времена, прежде чем память достигнет максимума 704 МБ? JVM может быть немного «агрессивным» в попытке уменьшить используемую память (и, возможно, переместить ее), прежде чем решить увеличить используемую память. Это ведет себя так же, если вы используете -Xms704m -Xmx704m? –
Используя «jstat -gc 1s pid», вы можете увидеть, использует ли ваше использование памяти в питомниках или если необходимо изменить распределение памяти между питомниками, eden и старым. –
Заканчивая профилирование приложения с помощью JProdilfer/Yourkit, у вас не будет никаких твердых предложений. –