Конфигурация Tomcat catalina для настройки памяти JVM

Tomcat

Разделение памяти JVM

堆内存划分

выделение памяти в куче

  • Распределение начального значения памяти кучи:-Xms, по умолчанию 1/64 физической памяти;
  • Максимальное выделение памяти кучи:-Xmx, по умолчанию это 1/4 физической памяти.

Свободная память кучи по умолчанию меньше, чем40%, JVM увеличивает кучу до тех пор, пока-Xmxмаксимальный предел; свободная память кучи больше, чем70%, JVM будет уменьшать кучу до тех пор, пока-Xmsминимальный лимит. Так сервер вообще настроен-Xms,-XmxEqual, чтобы избежать изменения размера кучи после каждого GC.

Выделение памяти вне кучи

  • Распределение начального значения памяти вне кучи:-XX:PermSize, по умолчанию 1/64 физической памяти;
  • Максимальное выделение памяти без кучи:-XX:MaxPermSize, по умолчанию это 1/4 физической памяти.

инструкция:

  1. если-XmxЕсли спецификация не указана или слишком мала, приложение может вызватьjava.lang.OutOfMemoryErrorОшибка.

  2. если-XX:MaxPermSizeУстановка слишком малого значения приведет кjava.lang.OutOfMemoryError: PermGen spaceЭто прирост памяти.

Почему улучшается память?

  • Эта часть памяти используется для храненияClassиMetaИнформация,Classвставляется при загрузкеPermGen spaceплощадь, это и хранениеInstanceОбласть кучи отличается.
  • GC (сборка мусора) не будет выполняться во время выполнения основной программы.PermGen spaceОчистите, поэтому, если ваше ПРИЛОЖЕНИЕ загружает много CLASS, оно, скорее всего, появитсяPermGen spaceОшибка. Такая ошибка распространена, когда веб-сервер создает JSP.pre compileкогда.

Описание параметра JVM

параметры JVM инструкция
-server Должен использоваться в качестве первого параметра, производительность хорошая на нескольких процессорах.
-Xms java Начальный размер кучи. По умолчанию это 1/64 физической памяти.
-Xmx максимальное значение кучи java. Рекомендуется установить их на половину физической памяти. Физическая память не может быть превышена.
-Xmn Размер кучи молодого поколения обычно устанавливается равным 3 или 1/4 от Xmx.
-XX:PermSize Установите начальный размер области постоянного хранения памяти, значение по умолчанию 64M.
-XX:MaxPermSize Установить максимальный размер области постоянного хранения памяти, значение по умолчанию 64M.
-XX:SurvivorRatio Размер пула выживших, по умолчанию 2, если сборка мусора станет узким местом, можно попробовать настроить параметры пула спавна
-XX:NewSize Начальный размер вновь созданного пула. Значение по умолчанию — 2M.
-XX:MaxNewSize Максимальный размер вновь созданного пула. Значение по умолчанию — 32M. Если размер кучи JVM больше 1 ГБ, следует использовать значения: -XX:newSize=640m -XX:MaxNewSize=640m -XX:SurvivorRatio=16 или выделить от 50% до 60% от общего размера кучи для нового сгенерированный пул. Увеличьте размер области нового объекта и уменьшите количество полных GC.
-XX:+AggressiveHeap сделает Xms бессмысленным. Этот параметр заставляет jvm игнорировать параметр Xmx, лихорадочно потреблять G физической памяти, а затем потреблять G подкачки.Ссылаться на
-Xss Размер стека каждого потока "-Xss 15120". Это заставляет JBoss немедленно потреблять 15 МБ памяти для каждого дополнительного потока (потока), и оптимальное значение должно быть 128 КБ, значение по умолчанию, по-видимому, равно 512 КБ.
-verbose:gc Информация о реалистичной сборке мусора
-Xloggc:gc.log Указывает файл журнала сборки мусора
-XX:userParNewGC Может использоваться для установки параллельного сбора [многоядерный процессор]
-XX:+UseSerialGC Использование серийных коллекторов в молодых и старых поколениях
-XX:+UseParNewGC Используйте параллельные сборщики в молодом поколении, чтобы сократить время второстепенного сбора
-XX:+UseParallelGC Новое поколение использует сборщики параллельных коллекций и уделяет больше внимания пропускной способности [многоядерный процессор].
-XX:+UseParallelOldGC В старом поколении используется сборщик параллельных коллекций.
-XX:ParallelGCThreads Установите количество потоков, используемых для сборки мусора [Многоядерный процессор]
-XX:+UseConcMarkSweepGC В новом поколении используется параллельный коллектор, а в старом поколении — CMS+последовательный коллектор.
-XX:ParallelCMSThreads Установить количество потоков в CMS
-XX:+UseG1GC Включить сборщик мусора G1

В частности, вtomcatнастроить в файле каталины:

JAVA_OPTS="-server -Xms1024m -Xmx8192m -XX:PermSize=256M -XX:MaxPermSize=1024m -Dfile.encoding=utf-8"

говорить в конце

Еще одна вещь, которую следует учитывать, — это механизм сборки мусора, предоставляемый Java. Размер кучи виртуальной машины определяет, сколько времени и как часто виртуальная машина тратит на сбор мусора.

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

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

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

Как правило, вы должны использовать 80% физической памяти в качестве размера кучи. При добавлении процессоров не забудьте увеличить объем памяти, поскольку выделение памяти может выполняться параллельно, а сборка мусора — нет.

PS:Ниже приведена конфигурация моей IDEA после настройки для разработки на Java:

-Xms2048m
-Xmx3072m
-XX:NewRatio=3
-Xss16m
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:ConcGCThreads=4
-XX:ReservedCodeCacheSize=240m
-XX:+AlwaysPreTouch
-XX:+TieredCompilation
-XX:+UseCompressedOops
-XX:SoftRefLRUPolicyMSPerMB=50
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-Dfile.encoding=utf-8

Ссылаться на: