2012-06-24 6 views
13

У нас есть веб-приложение под управлением 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 
+0

Получаете ли вы эти долгие времена, прежде чем память достигнет максимума 704 МБ? JVM может быть немного «агрессивным» в попытке уменьшить используемую память (и, возможно, переместить ее), прежде чем решить увеличить используемую память. Это ведет себя так же, если вы используете -Xms704m -Xmx704m? –

+0

Используя «jstat -gc 1s pid», вы можете увидеть, использует ли ваше использование памяти в питомниках или если необходимо изменить распределение памяти между питомниками, eden и старым. –

+1

Заканчивая профилирование приложения с помощью JProdilfer/Yourkit, у вас не будет никаких твердых предложений. –

ответ

3

Чтобы сократить время GC, самое лучшее, что вы можете сделать, это использовать от кучи памяти. Если вы можете перемещать как можно больше ваших больших данных, вы можете сократить время полного GC до 10 миллисекунд даже с 100 м Мбайт памяти кучи. Я считаю, что Ehcache поддерживает хранилища данных кучи, но если это не так, или вы не можете его использовать, я предлагаю вам взглянуть на альтернативы, которые делают.

Учитывая, что у вас есть только максимальный объем памяти 700 МБ, похоже, вы работаете на сервере с очень ограниченной памятью. В противном случае я предлагаю вам начать с максимум 8 или 16 ГБ и уменьшить размер памяти, если вы считаете, что вам это действительно не нужно.

+0

Размер памяти не должен быть проблемой в GC раза. Только количество объектов, созданных до начала GC. – user2763361

+1

@ user2763361 Число объектов очень важно и другие факторы, такие как hte количество ссылок и генерация этих ссылок, но это размер, который вы можете увидеть в инструментах мониторинга.Если вы уменьшите потребляемую память, вы можете повысить производительность, потому что это обычно означает уменьшение количества объектов и количество ссылочной нумерации. Короче говоря, вы правы, но использование памяти проще измерить. –

+0

Хорошо сказано. Связано: http://stackoverflow.com/questions/21675709/how-to-find-which-objects-are-creating-the-most-garbage – user2763361

1

Отличный инструмент от людей FourSquare. Проверьте эту ссылку и быстрый пример. Foursquare Heap tool.. Основываясь на диагностике, которую вы найдете в любом из вышеперечисленных инструментов, наиболее подходящим решением для решения проблемы будет либо добавление большего количества ОЗУ, либо добавление мощности к вашему процессору процессора. Если вы открыты для некоторых изменений инфраструктуры, проверьте Zing from Azul Systems. Но я думаю, что второй вариант может быть растянутым.

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