Частота сбора мусора Tomcat - PullRequest
       26

Частота сбора мусора Tomcat

7 голосов
/ 18 января 2012

Я новичок в Java и только что унаследовал установку Tomcat, поэтому мне нужны некоторые рекомендации :) На прошлой неделе я читал больше об алгоритмах настройки JVM и сбора мусора, чем хотелось бы!

Используя Visual VM / GC, наши серверы Tomcat делают полный GC меньше, чем раз в день. Учитывая, что большинство пользовательских веб-сеансов длятся меньше часа, это кажется мне очень редким, и, вероятно, в Перми много «мертвых» объектов в течение длительного времени? Так значит ли это, что у нас достаточно ОЗУ / кучи, и его просто не нужно собирать, а значит нет?

Учитывая это, было бы лучше сделать старый ген меньше, а новый - больше, так как скорость продвижения очень мала?

Я спрашиваю, потому что в других частях ОС есть признаки того, что у нас может быть давление памяти, но журналы JVM / GC, похоже, противоречат ОС.

С этим связано -

В настоящее время у нас есть min-heap=max-heap=6Gb. Если top показывает размер процесса Java 7-8 ГБ, а RSS 5-6 ГБ, возможно, это означает, что 2 ГБ выгружен? В этом случае он умирает, когда полон ГК. Поэтому было бы лучше иметь меньший размер минимальной кучи, чем GC, до того, как ОС его поменяет.

Как правило, лучше всего оставить JVM для самостоятельной настройки, вместо того, чтобы пытаться настроить все параметры вручную или большинство людей устанавливает параметры вручную?

Ответы [ 3 ]

8 голосов
/ 20 января 2012

Сборка мусора - это компромисс между распределением памяти и производительностью. Представь свой чердак. Если вы продолжаете бросать что-то в него, в конце концов, оно наполнится, и вам придется вычистить его. Если у вас небольшой чердак, вы можете заполнять его раз в месяц, но на уборку уйдет всего 20 минут. Если у вас действительно большой чердак, то на его заполнение может уйти год, а на уборку - выходные.

То же самое относится и к JVM. Если вы выделите 6 ГБ, но вы действительно сможете обойтись с 1,5 ГБ, тогда у вас будет гораздо менее частая сборка мусора, но когда они произойдут, это может остановить мир на минуту.

Сколько памяти освобождается сборщиками мусора?

Если мусорщики (копирующие из Eden в Survivor) восстанавливают большую часть памяти, то у вас много очень недолговечных объектов. Если вы увеличите размер New Generation, эти сборки мусора станут менее частыми, но они будут длиться дольше. В идеале вы хотите, чтобы они были как можно более быстрыми, а это означает, что это пространство должно быть достаточно маленьким, чтобы оно могло быстро сместиться, но достаточно большим, чтобы недолговечные объекты не были переведены в штатное поколение. Я бы не стал возиться с размером Нового поколения, если бы не был уверен, что объекты с коротким сроком службы (то есть запрос) хранятся, а их не должно быть.

Сколько памяти освобождается вашей полной сборкой мусора?

Если вам потребуется несколько дней, чтобы заполнить 6 ГБ, учитывая, что в куче накапливаются объекты из каждого пользовательского сеанса и запроса, которые вы когда-либо имели с момента последнего полного GC , я бы подозреваю, что вы освобождаете большую часть своей кучи с помощью полной GC. Если нет, то вам, вероятно, следует выяснить, есть ли у вас утечка памяти (возможно, мошеннический кеш). Если вы освобождаете большую часть кучи с помощью полного GC, вам следует выяснить, имеет ли смысл иметь меньший размер кучи.

Меньшая куча увеличит частоту полных сборок мусора, но сделает паузы значительно короче. В веб-приложении длительные паузы "стоп-мир" для полных сборок мусора недопустимы, если они происходят в пиковый период.

Если, как вы указываете, куча Java потенциально может быть заменена ОС, вам определенно следует обратить внимание на ее уменьшение. Но я бы не стал вмешиваться в размеры нового поколения.

8 голосов
/ 30 января 2013

Какую версию Tomcat вы используете?

В gubbins для предотвращения утечки памяти есть ошибка, которая приводит к полному сборке мусора в час:

https://issues.apache.org/bugzilla/show_bug.cgi?id=53267

(обратите внимание, что ошибка упоминает ее на tomcat7, но на нее влияют 6тоже исправлено в 6.0.36)

2 голосов
/ 19 января 2012

По своему опыту, я думаю, что операторы

"делают полный GC меньше, чем раз в день"

и

«В других частях ОС есть признаки того, что у нас могут быть проблемы с памятью»

противоречат друг другу.Как правило, частота GC увеличивается с увеличением объема памяти, и чем реже это происходит, тем лучше.

Помните, что полный GC означает, что вся активность приложения останавливается - иногда это может занять минуты, особенно для больших куч!

Например, здесь у меня есть несколько работающих систем с ~ 1,4K HTTP-сессиями каждый и каждый блок (-Xmx=13g) выполняет примерно 1-2 полных GC за час .В идеале мы хотели бы, чтобы это было еще реже, но из-за характера приложения мы не можем.

Вам необходимо уточнить, что является подлинной проблемой, которую вы пытаетесь решить, потому что из информации выучитывая, что я не вижу ничего, что требует настройки.

...