Разделение памяти JVM
выделение памяти в куче
- Распределение начального значения памяти кучи:
-Xms
, по умолчанию 1/64 физической памяти; - Максимальное выделение памяти кучи:
-Xmx
, по умолчанию это 1/4 физической памяти.
Свободная память кучи по умолчанию меньше, чем40%
, JVM увеличивает кучу до тех пор, пока-Xmx
максимальный предел; свободная память кучи больше, чем70%
, JVM будет уменьшать кучу до тех пор, пока-Xms
минимальный лимит. Так сервер вообще настроен-Xms
,-Xmx
Equal, чтобы избежать изменения размера кучи после каждого GC.
Выделение памяти вне кучи
- Распределение начального значения памяти вне кучи:
-XX:PermSize
, по умолчанию 1/64 физической памяти; - Максимальное выделение памяти без кучи:
-XX:MaxPermSize
, по умолчанию это 1/4 физической памяти.
инструкция:
-
если
-Xmx
Если спецификация не указана или слишком мала, приложение может вызватьjava.lang.OutOfMemoryError
Ошибка. -
если
-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
Ссылаться на: