Мы запускаем наше веб-приложение Spring + Hibernate на Tomcat (Java 1.5). В настоящее время мы используем 2 ГБ пространства кучи (мне сказали, что это максимально возможный объем на 32-битных серверах Solaris, хотя на сервере всего 16 ГБ ОЗУ). Текущие JAVA_OPTS:
-XX: MaxPermSize = 512m -XX: + UseParallelGC -Xms2048m -Xmx2048m
Пространство Young Gen + Survivor составляет ~ 600 МБ, а Old Gen - 1,4 ГБ.
Есть время, когда память заполняется, и нам нужно перезапустить Tomcat. Ниже приведены наблюдения:
- При активной работе сервера в течение приблизительно 16 часов ГХ тратит около часа на MarkSweep (~ 300 коллекций - Old Gen) и 5-7 минут на очистку (~ 1500 коллекций - Young Gen).
- Бывают случаи, когда Old Gen заполняется через 10 минут, и нам нужно перезагрузить сервер. Идентификация вызывающей нить не очень удалась
Мы хотели бы перейти к следующему JAVA_OPTIONS - мне нужна информация о том, является ли это разумным выбором (среды UAT не соответствуют нагрузке Prod env, и мы не можем повторить то же самое в UAT)
Добавить -Xmn1024m - Это сделано для того, чтобы объекты «Молодого поколения» не могли быть легко переведены в «Старое поколение». Есть предложения по увеличению / уменьшению этого? Кроме того, это привело бы к большему количеству юных генералов и меньшим старым генералам.
-XX: + UseParallelOldGC - чтобы заставить GC Young и Old Gening запускать несколько потоков, чтобы они быстрее получали GCed.
Применимо ли ограничение в 2 ГБ к серверам Solaris? Может ли куча быть увеличена до более чем 2 ГБ?
Пожалуйста, поделитесь своими мыслями по поводу вышеизложенного.
Спасибо,
Midhun