Сводка параметров JVM: Какова соответствующая настройка памяти JVM? Как настроить Xmx и Xmn? [Легко понять]
Сводка параметров JVM: Какова соответствующая настройка памяти JVM? Как настроить Xmx и Xmn? [Легко понять]

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

Сводка параметров JVM

Ссылка:[#link](https://www.cnblogs.com/duanxz/p/3482366.html)

1. Параметры запуска Java разделены на три категории:

Один из них — стандартный параметр (-). Все реализации JVM должны реализовывать функциональность этих параметров.,иобратная совместимость; Второй — нестандартный параметр (-X), JVM по умолчанию реализует функции этих параметров.,Но нет никакой гарантии, что все реализации jvm будут удовлетворены.,且不保证обратная совместимость; Третье правильное и неправильноеStableпараметр(-XX),Этот типпараметрКаждая реализация jvm будет отличаться.,Они нестабильны и не рекомендуются для использования в производственных средах. Может быть отменено в любое время в будущем,Нужно использовать с осторожностью; все вышеперечисленное реализовано),и Если в новой версии будут какие-либо изменения, уведомление не будет выпущено.。 Для систем с высокими требованиями ко времени отклика важно хорошо понимать параметры настройки GC JVM. Например, электронная торговая платформа с высоким трафиком и задержками требует времени отклика в миллисекундах. Получение подходящей комбинации параметров требует большого анализа и постоянных попыток и в большей степени зависит от характеристик торговой системы.

Несколько замечаний по поводу опций JVM: 1) Параметры логического параметра: -XX:+ Открыть, -XX:- закрытие。(например-XX:+PrintGCDetails) 2) Параметры числовых параметров задаются через -XX:=. Числа могут быть m/M (мегабайты), k/K (килобайты), g/G (Гбайты). например:32Kвыражать32768байт。(например-XX:HeapDumpPath=./java_pid.hprof) 3) строка символовпараметрвариант принят-XX:=настраивать,Обычно используется для указания файла,путь,или Заказсписок。(например-XX:+PrintGCDetails) Заказ java -help может перечислить Java Стандартные параметры при запуске приложения (разные реализации JVM отличаются). java -X может перечислять нестандартные параметры (это расширенная функция JVM). Параметры, связанные с -X, не являются стандартными и не будут уведомлены, если они будут изменены. Если вы хотите просмотреть параметры JVM, используемые текущим приложением, вы можете использовать: ManagementFactory.getRuntimeMXBean().getInputArguments().

2. Наиболее полезные стандартные параметры:

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

-verbose:gc Выведите соответствующую информацию о каждом GC.

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

Заказ Просмотр файлов байт-кода класса Java, подробный, синхронизация

3. Нестандартные параметры еще называют расширенными параметрами.

Какова соответствующая настройка памяти JVM? Как настроить Xmx и Xmn?

Ссылка::[#link](https://www.dutycode.com/m/?post=153)

Конкретно: обратитесь к размерам сохранившихся объектов старого поколения.

Все настройки размера кучи Java, Xmx и Xms установлены в 3-4 раза больше, чем выжившие объекты в старом поколении, то есть в 3-4 раза больше памяти, занимаемой старым поколением после FullGC.

PermSize и MaxPermSize постоянного поколения установлены в 1,2–1,5 раза больше количества сохранившихся объектов в старом поколении.

Xmn молодого поколения установлен в 1-1,5 раза больше, чем сохранившиеся объекты старого поколения.

Размер памяти старого поколения установлен в 2-3 раза больше уцелевших объектов старого поколения.

BTW:

1. Sun официально рекомендует, чтобы размер молодого поколения составлял примерно 3/8 всей кучи, поэтому приведенные выше настройки в основном соответствуют рекомендациям Sun.

2. Размер кучи = размер молодого поколения + размер старого поколения, то есть xmx = xmn + размер старого поколения. Permsize не влияет на размер кучи.

3. Зачем нужно настраивать как указано выше? Конкретного объяснения нет, но это должен быть вывод, сделанный после различных корректировок.

Как подтвердить размеры сохранившихся объектов старого поколения?

Метод 1 (рекомендуется/безопаснее):

Добавить журналы GC в параметры JVM,В журнале GC будет записываться размер памяти каждого поколения после каждого FullGC.,Обратите внимание на размер пространства после ГХ старого поколения. Вы можете наблюдать за ситуацией с памятью после FullGC в течение определенного периода времени (например, 2 дней).,на основе несколькихFullGCПозже оцениваются данные о размерах пространства старого поколения.FullGCРазмер сохранившихся объектов старого поколения после этого(Вы можете усреднить размер памяти после нескольких FullGC)

Способ 2: (Принудительный запуск FullGC повлияет на онлайн-сервисы, используйте с осторожностью)

Способ 1 более реалистичен, но требует изменения параметров JVM и анализа логов. При этом при использовании сборщика CMS FullGC может не срабатывать (происходит только CMS GC), поэтому в журнал не записывается FullGC. Сложнее разобраться во время анализа.

Кстати: при использовании инструмента jstat -gcutil для просмотра FullGC CMS GC приведет к увеличению количества FullGC в два раза. Для получения подробной информации обратитесь к статье, которую я написал ранее об использовании jstat.

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

Примечание. Принудительный запуск FullGC приведет к приостановке онлайн-сервиса (STW). Рекомендуемый метод работы — удалить служебный узел перед принудительной проверкой FullGC. После завершения FullGC верните службу на доступный узел для предоставления внешних служб.

Запускайте FullGC в разные периоды времени и оценивайте размер сохранившихся объектов в старом поколении после FullGC на основе условий памяти старого поколения после нескольких FullGC.

Как запустить FullGC?

Используйте инструмент jmap для запуска FullGC

jmap -dump:live,format=b,file=heap.bin <pid> Сохраните текущие живые объекты в файл, что запустит FullGC.

jmap -histo:live <pid> Выведите количество экземпляров каждого класса, использование памяти и полную информацию об имени класса. После добавления подпараметра live подсчитывается только количество живых объектов. FullGC будет запущен в это время

Ссылка:[#link](https://www.dutycode.com/m/?post=153)

Нестандартизированные параметры могут измениться в будущих версиях. Все такие параметры начинаются с -X,и может быть использованjava -Xискать。Уведомление,Нет никакой гарантии, что все параметры могут быть получены.,Среди них нет -Xcomp. Например:

Введение в часто используемые параметры:

-Xms512m Установите JVM, чтобы установить память на 512 м. Это значение можно установить так же, как и -Xmx, чтобы JVM не перераспределяла память после каждой сборки мусора. -Xmx512m , установите максимальный доступный объем памяти JVM равным 512 МБ. -Xmn200m:Установите размер молодого поколения на200M。Размер здесь(eden+ 2 survivor пространство).с jmap -Новые отображаются в куче поколение (eden+1 survivor пространство) разные.

Формула расчета:

Размер старого поколения = -Xmx минус -Xmn

Весь размер кучи = размер молодого поколения + размер старого поколения + размер постоянного поколения.

Постоянное поколение обычно имеет фиксированный размер 64 м.,Так увеличивайте молодое поколение(-Xmn)назад,Это снизит стоимость предыдущего поколения. Это значение оказывает большее влияние на производительность системы.,SunОфициальная рекомендуемая конфигурацияэто 3/8 всей кучи

-XX:SurvivorRatio

Используется для установки соотношения между Эдемом и одним из Выживших. Соотношение по умолчанию — 8 (Эдем): 1 (один выживший). Это значение также важно.

Например:XX:SurvivorRatio=4:Установите молодое поколение Соотношение размеров области Эдема и области Выжившего.. установить на 4,Тогда соотношение двух областей Выжившего к одной области Эдема будет 2:4.,На территорию Выжившего приходится 1/6 всего молодого поколения.

-Xss128k:настраивать Размер стека на поток. После JDK5.0 размер стека каждого потока составлял 1 МБ. Раньше размер стека каждого потока составлял 256 КБ. Отрегулируйте размер памяти, необходимый для большего количества потоков приложений. При той же физической памяти уменьшение этого значения может привести к созданию большего количества потоков. Однако операционная система по-прежнему имеет ограничение на количество потоков в процессе и не может генерироваться бесконечно. Значение опыта составляет около 3000–5000. -Xloggc:file Функция аналогична -verbose:gc, за исключением того, что соответствующая информация о каждом событии GC записывается в файл. Местоположение файла предпочтительно является локальным, чтобы избежать потенциальных проблем в сети. Если в то же время в строке Order появляется подробный заказ, преимущественную силу имеет -Xloggc. -Xprof Отслеживайте работающую программу и выводите данные трассировки на стандартный вывод, подходящий для отладки в среде разработки;

-Xrunhprof

-Xdebug:JVMПараметры отладки, для удаленной отладки

Например, метод настройки удаленной отладки в Tomcat: -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000.

-Xbootclasspath:

-Xbootclasspath используется для указания пути к классу, который вам нужно загрузить, но вы не хотите проходить проверку. JVM Все классы будут проверены перед загрузкой и применены через значение int для каждого класса. Это гарантия JVMнеобходимый процесс стабилизации,Но это отнимает больше времени,Если вы хотите пропустить этот процесс,Просто передай свой урок этомупараметруказать。Параметр -Xbootclasspath, Java Как установить путь к классам при запуске приложения с параметром -jar

-Xnoclassgc:

-Xnoclassgc выражать Не выполнять сбор мусора в области метода.。Пожалуйста, используйте с осторожностью。ВидетьGC Анализ алгоритмов и знакомство с различными сборщиками мусора

-XX:MaxMetaspaceSize

В java8 -XX:MaxMetaspaceSize=10M устанавливает максимальное значение MetaSpace равным 10 м. По умолчанию используется метапространство Java: неограниченно.

4. Нестабильные параметры.

Список параметров с префиксом -XX может быть ненадежным в jvm, и использование SUN не рекомендуется. Однако многие из этих параметров действительно очень полезны для нас, например -XX:PermSize, -. XX:MaxPermSize и т. д., которые мы часто видим;

Сначала давайте познакомимсяповеденческие параметры

Параметры и их значения по умолчанию

описывать

-XX:-DisableExplicitGC

Вызов System.gc() запрещен, но gc jvm все еще действителен;

-XX:+MaxFDLimit

Увеличьте ограничение на количество описываемых символов файла.

-XX:+ScavengeBeforeFullGC

Сборщик мусора нового поколения имеет приоритет над полным сборщиком мусора.

-XX:+UseGCOverheadLimit

Ограничьте долю времени, которое JVM тратит на сборщик мусора перед запуском OOM.

-XX:-UseConcMarkSweepGC

Используйте алгоритм одновременного обмена метками для выполнения GC на старом поколении.

-XX:-UseParallelGC

Включить параллельный сборщик мусора

-XX:-UseParallelOldGC

Включить параллелизм для полного GC. Этот параметр включается автоматически, если включен -XX:-UseParallelGC.

-XX:-UseSerialGC

Включить последовательный ГХ

-XX:+UseThreadPriorities

Включить приоритет локального потока

Три параметра, выделенные жирным шрифтом в таблице выше, представляют параметры jvm. GCтри способа,Прямо сейчасПоследовательный, параллельный, параллельный; SerialGC — это метод сборки мусора по умолчанию в jvm. Обычно он подходит для небольших приложений и одиночных процессоров. Алгоритм относительно прост, а эффективность сбора мусора высока, но может вызывать паузы в работе приложения. ParallelGC означает, что когда GC работает, он не влияет на работу приложения. Потоки GC и приложения выполняются одновременно, поэтому на работу приложения это не влияет в максимальной степени; Параллелизм (ConcMarkSweepGC) относится к нескольким потокам, выполняющим сборщик мусора одновременно. Обычно он подходит для многопроцессорных систем и может повысить эффективность сборщика мусора, но алгоритм сложен, и система потребляет много денег.

Настройка производительностипараметрсписок:

Параметры и их значения по умолчанию

описывать

-XX:LargePageSizeInBytes=4m

Установить большой размер страницы для кучи Java

-XX:MaxHeapFreeRatio=70

Максимальная доля свободного места в куче Java после GC

-XX:MaxNewSize=size

Максимальный объем памяти, который может занимать вновь созданный объект.

-XX:MaxPermSize=64m

Максимальный объем памяти, который могут занимать объекты старого поколения

-XX:MinHeapFreeRatio=40

Минимальная доля свободного места в куче Java после GC

-XX:NewRatio=2

Соотношение объема памяти нового поколения к объему памяти старого поколения

-XX:NewSize=2.125m

Значение по умолчанию памяти, занимаемой объектами нового поколения при их создании.

-XX:ReservedCodeCacheSize=32m

Объем памяти, занимаемый зарезервированным кодом

-XX:ThreadStackSize=512

Установите размер стека потоков. Если он равен 0, используйте системное значение по умолчанию.

-XX:+UseLargePages

Используйте большую страничную память

В основном мы используем эти атрибуты вышеупомянутого черного тела при ежедневной настройке производительности;

Параметры отладкисписок:

Параметры и их значения по умолчанию

описывать

-XX:-CITime

Распечатайте время, потраченное на JIT-компиляцию.

-XX:ErrorFile=./hs_err_pid<pid>.log

Сохранение журнала ошибок или данных в файл.

-XX:-ExtendedDTraceProbes

Включить зонд dtrace, специфичный для Solaris

-XX:HeapDumpPath=./java_pid<pid>.hprof

Укажите путь или имя файла при экспорте информации о куче.

-XX:-HeapDumpOnOutOfMemoryError

Экспортируйте соответствующую информацию в кучу при первом столкновении с OOM.

-XX:OnError=”<cmd args>;<cmd args>”

Запуск пользовательского заказа после фатальной ОШИБКИ

-XX:OnOutOfMemoryError=”<cmd args>;<cmd args>”

Выполните индивидуальный заказ при первой встрече с OOM.

-XX:-PrintClassHistogram

Вывести столбчатую информацию об экземплярах класса после нажатия Ctrl-Break, которая имеет ту же функцию, что и jmap -histo.

-XX:-PrintConcurrentLocks

Распечатать информацию, связанную с блокировкой одновременного доступа, после нажатия Ctrl-Break, которая имеет ту же функцию, что и jstack -l.

-XX:-PrintCommandLineFlags

Распечатайте жетоны, которые появляются в строке заказа.

-XX:-PrintCompilation

Вывод информации при компиляции метода

-XX:-PrintGC

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

-XX:-PrintGCDetails

Распечатывать подробную информацию каждый раз при сборе мусора.

-XX:-PrintGCTimeStamps

Распечатайте временную метку каждого GC.

-XX:-TraceClassLoading

Отслеживание информации о загрузке классов

-XX:-TraceClassLoadingPreorder

Отслеживайте информацию о загрузке всех классов, на которые есть ссылки.

-XX:-TraceClassResolution

Следите за постоянным пулом

-XX:-TraceClassUnloading

Отслеживать информацию об удалении классов

-XX:-TraceLoaderConstraints

Отслеживание информации об ограничениях загрузчика классов

5. Как использовать параметры

1. Настройте аргументы виртуальной машины в eclipse.

Например:проект–>properties–>run/debug setting–>Выберите целевой классTest.java–>edit–>arguments–>VM arguments–>входить:-XX:+TraceClassLoading

Подробности загрузки класса будут напечатаны.

2. Параметры в javaЗаказе

Затем сначала скомпилируйте его с помощью javac Test.java. Затем используйте java -XX:+TraceClassLoading Test. Затем на консоли можно распечатать большую серию логов.

3. Добавлен в скрипт запуска.

-XX:+TraceClassLoading

6. Сводка параметров

Будь то YGC или Full GC,Во время процесса GC выполнение программы будет прервано.,правильный выборРазличные стратегии GC,КорректированиеJVM、GCизпараметр,Может значительно сократить работу GC из-за,Проблемы, вызванные прерыванием программы,Затем соответствующим образом улучшите эффективность работы Java-программ. Но настройка GC — чрезвычайно сложный процесс.,Поскольку каждая программа имеет разные характеристики,Например: существует большая разница между веб-программами и программами с графическим интерфейсом (веб-программы могут приостанавливаться соответствующим образом).,Но паузы в GUI для клиентов неприемлемы),А поскольку конфигурации, работающие на каждой машине, разные (в основном количество чашек,память другая),Так используетсяGCТипы также будут разными.(каквыбирать ВидетьТипы GC и как выбрать)。В этой статье речь пойдет о знакомствеJVM、Установите некоторые важные параметры GC, чтобы улучшить производительность системы.

Состав памяти JVMиGCПожалуйста, обратитесь к соответствующему контенту Видеть之前из文章:Состав памяти JVM GCСтратегия&Приложение памяти

Значение параметров JVM Пример ВидетьАнализ случая

Имя параметра

значение

значение по умолчанию

-Xms

Начальный размер кучи

1/64 физической памяти(<1GB)

По умолчанию (параметр MinHeapFreeRatio можно настроить), когда свободная память в куче меньше 40%, JVM будет увеличивать кучу до максимального предела -Xmx.

-Xmx

максимальный размер кучи

1/4 физической памяти(<1GB)

По умолчанию (параметр MaxHeapFreeRatio можно настроить), когда свободная память кучи превышает 70%, JVM будет уменьшать кучу до минимального предела -Xms.

-Xmn

Размер молодого поколения (1,4 или лат)

Примечание. Размер здесь (eden+ 2 survivor пространство).с jmap -Новые отображаются в куче ген другой. Весь размер кучи = размер молодого поколения + размер старого поколения + Постоянный размер поколения. После увеличения молодого поколения размер уменьшится. старого Это значение оказывает большее влияние на производительность системы. Sun официально рекомендует такую ​​конфигурацию. 3/8 всей кучи

-XX:NewSize

Установить размер молодого поколения (для 1,3/1,4)

-XX:MaxNewSize

Максимальное значение для молодого поколения (за 1,3/1,4)

-XX:PermSize

Установите начальное значение постоянной генерации (perm gen)

1/64 физической памяти

-XX:MaxPermSize

Установите максимальный размер постоянного поколения

1/4 физической памяти

-Xss

Размер стека на поток

После JDK5.0 размер стека каждого потока составлял 1 МБ. Раньше размер стека каждого потока составлял 256 КБ. Размер памяти, необходимый для потока приложения, можно регулировать при той же физической памяти, что позволяет уменьшить это значение. больше потоков Однако операционная система по-прежнему имеет ограничение на количество потоков в процессе и не может генерироваться бесконечно. Эмпирическое значение составляет около 3000–5000 для небольших приложений. Если стек не очень глубок, 128 КБ должно быть достаточно. для больших приложений рекомендуется использовать 256k. Этот вариант оказывает большее влияние на производительность и требует тщательного тестирования. (Принципал) Объяснение опции threadstacksize похоже в официальных документах нет. На форуме есть такое предложение: ""-Xss переводится в флаг ВМ с именем ThreadStackSize" Вообще, установка этого. стоимости достаточно.

–XX:ThreadStackSize

Thread Stack Size

(0 means use default stack size) [Sparc: 512; Solaris x86: 320 (was 256 prior in 5.0 and earlier); Sparc 64 bit: 1024; Linux amd64: 1024 (was 0 in 5.0 and earlier); all others 0.]

-XX:NewRatio

Соотношение молодого поколения (включая Эдем и две области Выживших) к старому поколению (исключая стойкое поколение)

-XX:NewRatio=4 означает, что соотношение между молодым поколением и старым поколением составляет 1:4, и на молодое поколение приходится 1/5 всего стека. Если установлены Xms=Xmx и Xmn, этот параметр не используется. необходимо установить.

-XX:SurvivorRatio

Соотношение размеров области Эдема и области Выжившего.

Если установить значение 8, то соотношение двух областей Выживших к одной области Эдема составит 2:8, а на одну область Выживших приходится 1/10 всего молодого поколения.

-XX:LargePageSizeInBytes

Размер страницы памяти нельзя установить слишком большим, что повлияет на размер Perm.

=128m

-XX:+UseFastAccessorMethods

Быстрая оптимизация примитивных типов

-XX:+DisableExplicitGC

Закрыть Система.gc()

Этот параметр требует тщательного тестирования.

-XX:MaxTenuringThreshold

Максимальный возраст мусора

Если установлено значение 0, объекты молодого поколения будут напрямую входить в старое поколение, не проходя через область Survivor. Для приложений с большим количеством старых поколений эффективность может быть улучшена, если для этого значения установлено большее значение, молодое. Объекты поколения будут копироваться несколько раз в области «Выживший», что может увеличить время выживания объекта в молодом поколении и повысить вероятность его повторного использования в молодом поколении. Этот параметр действует только в последовательном сборщике мусора.

-XX:+AggressiveOpts

ускорить компиляцию

-XX:+UseBiasedLocking

Улучшения производительности механизма блокировки.

-Xnoclassgc

Отключить сбор мусора

-XX:SoftRefLRUPolicyMSPerMB

Время выживания SoftReference на мегабайт свободного пространства в куче

1s

softly reachable objects will remain alive for some amount of time after the last time they were referenced. The default value is one second of lifetime per free megabyte in the heap

-XX:PretenureSizeThreshold

Если объект превышает размер, он выделяется непосредственно в старом поколении.

0

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

-XX:TLABWasteTargetPercent

TLAB в процентах от площади Эдема

1%

-XX:+CollectGen0First

Стоит ли сначала YGC во время FullGC

false

Параметры, связанные с параллельным коллектором

-XX:+UseParallelGC

Полный GC использует параллельный MSC (это необходимо проверить)

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

-XX:+UseParNewGC

Настроить молодое поколение на параллельный сбор

Может использоваться с коллекцией CMS одновременно с JDK5.0 или выше, JVM настроится в соответствии с конфигурацией системы, поэтому устанавливать это значение нет необходимости.

-XX:ParallelGCThreads

Количество параллельных потоков коллектора

Лучше всего настроить это значение равным количеству процессоров. Это также относится к CMS.

-XX:+UseParallelOldGC

Метод сбора мусора старого поколения — параллельный сбор (параллельное сжатие).

Это опция параметра, которая появляется в JAVA 6.

-XX:MaxGCPauseMillis

Максимальное время сбора мусора каждого молодого поколения (максимальное время паузы)

Если это время невозможно уложиться, JVM автоматически отрегулирует размер молодого поколения в соответствии с этим значением.

-XX:+UseAdaptiveSizePolicy

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

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

-XX:GCTimeRatio

Установите время сборки мусора в процентах от времени работы программы.

Формула: 1/(1+n)

-XX:+ScavengeBeforeFullGC

Позвоните в YGC перед полным сбором мусора

true

Do young generation GC prior to a full GC. (Introduced in 1.4.1.)

Параметры, связанные с CMS

-XX:+UseConcMarkSweepGC

Использование коллекции памяти CMS

После настройки этого в тесте конфигурация -XX:NewRatio=4 не удалась по неизвестным причинам. Поэтому лучше всего использовать -Xmn для установки размера молодого поколения.???

-XX:+AggressiveHeap

Попытка оптимизировать долговременное использование памяти с использованием большого объема физической памяти. Можно проверить вычислительные ресурсы (память, количество процессоров). Требуется как минимум 256 МБ памяти. (1.4). .1 показал улучшение по сравнению с машиной с 4 процессорами).

-XX:CMSFullGCsBeforeCompaction

Через сколько раз выполнить сжатие памяти

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

-XX:+CMSParallelRemarkEnabled

Уменьшить паузу в маркировке

-XX+UseCMSCompactAtFullCollection

Во время FULL GC сжатие старого поколения

CMS не перемещает память, поэтому очень легко вызвать фрагментацию, приводящую к нехватке памяти. Поэтому в это время будет включено сжатие памяти. Рекомендуется увеличить этот параметр. Может повлиять на производительность, но может устранить фрагментацию

-XX:+UseCMSInitiatingOccupancyOnly

Запустить сбор CMS, используя определение инициализации определения вручную.

Отключить хост-спот от запуска CMS GC самостоятельно

-XX:CMSInitiatingOccupancyFraction=70

Использовать cms для сбора мусора. Запускать сборку CMS после 70 % использования.

92

Чтобы гарантировать, что ошибка не удалось повысить (см. ниже), установка этого значения должна соответствовать следующей формуле: Формула расчета CMSInitiatingOccupancyFraction.

-XX:CMSInitiatingPermOccupancyFraction

Установите процент использования Permgen, который срабатывает

92

-XX:+CMSIncrementalMode

Установите инкрементальный режим

Для корпуса с одним процессором

-XX:+CMSClassUnloadingEnabled

вспомогательная информация

-XX:+PrintGC

Выходной формат: [GC 118250K->113543K(130112K), 0.0094143 secs] [Full GC 121376K->10414K(130112K), 0.0650971 secs]

-XX:+PrintGCDetails

Выходной формат:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]

-XX:+PrintGCTimeStamps

-XX:+PrintGC:PrintGCTimeStamps

Может использоваться с -XX:+PrintGC. -XX:+PrintGCDetails смешанного использования Выходной формат:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]

-XX:+PrintGCApplicationStoppedTime

Выведите время паузы программы во время сборки мусора. Можно смешать с указанным выше.

Выходной формат:Total time for which application threads were stopped: 0.0468229 seconds

-XX:+PrintGCApplicationConcurrentTime

Выведите время непрерывного выполнения программы перед каждой сборкой мусора. Можно смешать с приведенным выше.

Выходной формат:Application time: 0.5291524 seconds

-XX:+PrintHeapAtGC

Печать подробной информации о стеке до и после ГХ

-Xloggc:filename

Запишите соответствующую информацию журнала в файл для анализа. Используйте в сочетании с вышеизложенным.

-XX:+PrintClassHistogram

garbage collects before printing the histogram.

-XX:+PrintTLAB

Проверьте использование пространства TLAB

XX:+PrintTenuringDistribution

Проверяйте порог нового периода выживания после каждого незначительного GC.

Желаемый размер оставшегося времени 1048576 байт, новый порог 7 (максимум 15) новый порог 7 означает, что порог, определяющий новый период выживания, равен 7.

Вопросы производительности GC

Существует два основных показателя производительности сборщика мусора: пропускная способность (время работы не учитывается как отношение времени сборщика мусора к общему времени) и пауза (приложение не может ответить при возникновении сборщика мусора).

1. Total Heap

По умолчанию виртуальная машина будет увеличивать/уменьшать размер кучи, чтобы поддерживать долю свободного пространства во всей виртуальной машине. Это соотношение задается параметрами MinHeapFreeRatio и MaxHeapFreeRatio.

Вообще говоря, серверные приложения будут иметь следующие правила:

  • Выделите как можно больше памяти для виртуальной машины;
  • Установите для Xms и Xmx одинаковое значение. Если объем памяти, используемый виртуальной машиной при ее запуске, относительно невелик, и в это время необходимо инициализировать множество объектов, виртуальной машине придется многократно увеличивать объем памяти.
  • По мере увеличения количества ядер процессора увеличивается и объем памяти.

2. The Young Generation

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

NewRatio отражает соотношение численности молодых и постоянных поколений. NewSize и MaxNewSize отражают нижний и верхний пределы размера молодого поколения. Установка одинаковых значений для этих двух значений зафиксирует размер молодого поколения (так же, как установка одинаковых значений для Xms и Xmx).

При желании SurvivorRatio также может оптимизировать размер выжившего, но на производительность это не оказывает большого влияния. SurvivorRatio — это соотношение между Эдемом и выжившим.

Вообще говоря, серверные приложения будут иметь следующие правила:

  • Сначала определите максимальный размер кучи, который может быть выделен виртуальной машине, а затем установите оптимальный размер молодого поколения;
  • Если размер кучи фиксирован, увеличение размера молодого поколения означает уменьшение размера постоянного поколения. Пусть постоянная генерация будет достаточно большой, чтобы вместить все текущие данные в любое время (оставляя 10–20 % свободными).

опыт&&правило

  1. Выбор размера молодого поколения
    • Приложения с приоритетом времени ответа: установите максимально возможное значение, пока оно не приблизится к минимальному пределу времени ответа системы (выбирайте в соответствии с реальной ситуацией). В этом случае частота сбора данных молодого поколения также будет наименьшей. В то же время сократите количество обращений к объекту старого поколения.
    • Приложения, ориентированные на пропускную способность: установите максимально возможный размер, возможно, до гигабит. Поскольку нет требований ко времени ответа, сбор мусора может выполняться параллельно, и обычно он подходит для приложений с более чем 8 процессорами.
    • Избегайте установки слишком маленького значения. Если для нового поколения установлено слишком маленькое значение, это приведет к следующему: 1. Время YGC будет более частым. 2. Это может привести к тому, что объект YGC напрямую войдет в старое поколение. Если старое поколение в это время заполнено, сработает FGC.
  2. размер старого поколениявыбирать
    1. Приложения с приоритетом времени ответа: старое поколение использует параллельный сборщик, поэтому его размер необходимо устанавливать осторожно. Как правило, необходимо учитывать некоторые параметры, такие как частота одновременных сеансов и продолжительность сеанса. Если куча установлена ​​на небольшой размер, это может привести к возникновению проблем. фрагментация памяти. Традиционный метод маркировки и очистки используется для фрагментов, высокой частоты повторного использования и приостановки приложения; если куча большая, сбор займет много времени. Оптимальное решение обычно необходимо получить, опираясь на следующие данные: Информация о параллельной сборке мусора, количество одновременных сборок постоянного поколения, традиционная информация GC и доля времени, затрачиваемого на сборку молодого поколения и старого поколения.
    2. Приложения, ориентированные на пропускную способность. Как правило, приложения, ориентированные на пропускную способность, имеют большое молодое поколение и небольшое старое поколение. Причина в том, что это может максимально переработать большинство краткосрочных объектов и уменьшить количество среднесрочных объектов. поколение сохраняет только долговременно сохранившиеся объекты.
  3. Проблемы фрагментации, вызванные меньшими кучами Поскольку параллельный сборщик старого поколения использует алгоритм пометки и очистки, куча не будет сжиматься. При перезапуске сборщика он объединит соседние пространства, чтобы их можно было выделить для более крупных объектов. Однако, когда пространство кучи равно. небольшие, «фрагменты» появятся после работы в течение определенного периода времени. Если параллельный сборщик не сможет найти достаточно места, он остановится, а затем будет использовать традиционные методы маркировки и очистки. Если «Фрагменты», вам может потребоваться повторное использование. настройте следующее: -XX:+UseCMSCompactAtFullCollection: при использовании параллельного сборщика включите сжатие старого поколения. -XX:CMSFullGCsBeforeCompaction=0: если указанная выше конфигурация включена, укажите здесь, сколько раз будет использоваться полный сборщик мусора для сжатия старого поколения.
  4. В 64-битной операционной системе 64-битный jdk под Linux работает медленнее, чем 32-битный jdk, но он потребляет больше памяти и имеет большую пропускную способность.
  5. Параметры XMX и XMS имеют одинаковый размер, а параметры MaxPermSize и MinPermSize имеют одинаковый размер, что может снизить давление, вызванное масштабированием размера кучи.
  6. Преимущество использования CMS заключается в использовании как можно меньшего количества новых поколений. Эмпирическое значение составляет 128–256M. Тогда старое поколение использует CMS для параллельного сбора, что может обеспечить эффективность пропускной способности системы с малой задержкой. На самом деле время паузы сбора cms очень короткое. При 2Г памяти время паузы приложения составляет около 20-80мс.
  7. Когда система приостанавливается, это может быть проблема со сборщиком мусора или проблема с программой. Используйте jmap и jstack для проверки или killall -3 java, а затем проверьте журнал консоли Java, вы можете увидеть множество проблем. (Об использовании соответствующих инструментов будет рассказано в следующем блоге)
  8. Внимательно изучите свое приложение. Если используется кэширование, старое поколение должно быть больше. Кэшированный HashMap не должен быть неограниченной длины. Для кэширования рекомендуется использовать карту алгоритма LRU. Максимальная длина LRUMap также должна быть установлена ​​в соответствии с. реальная ситуация.
  9. При использовании одновременной переработки молодое поколение должно быть меньше, а старое поколение — больше. Поскольку старое поколение использует параллельную переработку, это не повлияет на дальнейшую работу других программ, и веб-сайт не остановится, даже если это займет много времени. .
  10. Не существует фиксированной формулы для настройки параметров JVM (особенно -Xmx -Xms -Xmn -XX:SurvivorRatio -XX:MaxTenuringThreshold. Ее необходимо измерять на основе фактических данных в старой области PV, времени YGC и других аспектах). . Во избежание продвижения по службе. Ошибка может привести к тому, что настройки xmn станут слишком маленькими, что также означает, что количество YGC увеличится, а возможность обработки одновременного доступа уменьшится. Каждая настройка параметров требует детального тестирования производительности, чтобы найти лучшую конфигурацию для конкретного приложения.

promotion failed:

Ошибка продвижения во время сборки мусора — очень головная проблема. Как правило, это может произойти по двум причинам. Первая причина заключается в том, что в резервном пространстве недостаточно объектов, но они есть. много объектов в молодом поколении необходимо поместить в спасательное пространство; вторая причина в том, что старому поколению не хватает места для приема объектов от молодого поколения, и в обоих случаях оно обратится к Full GC; время паузы веб-сайта будет дольше.

Решение первое:

Мое окончательное решение по первой причине — удалить пространство восстановления и установить -XX:SurvivorRatio=65536 -XX:MaxTenuringThreshold=0. Мое решение по второй причине — установить для CMSInitiatingOccupancyFraction определенное значение (предполагается, что оно равно 70). , CMS будет запущена, когда пространство старого поколения достигнет 70%, и у старого поколения будет достаточно места для приема объектов от молодого поколения.

Улучшение первого решения:

Произошло еще одно улучшение. Вышеописанный метод не очень хорош, поскольку пространство восстановления не используется, поэтому старое поколение легко заполняется, и выполнение CMS будет более частым. Я немного улучшил его и по-прежнему использовал пространство восстановления, но увеличил пространство восстановления, чтобы не было провалов в повышении. С точки зрения конкретных операций 32-битный Linux и 64-битный Linux кажутся разными. Кажется, что 64-битной системе нужно настроить только параметр MaxTenuringThreshold, но CMS все равно будет делать паузу. Чтобы решить проблему паузы и проблему с неудачным продвижением, я, наконец, установил -XX:SurvivorRatio=1 и удалил MaxTenuringThreshold, чтобы не было паузы и сбоя продвижения, и, что более важно, старое поколение и постоянное поколение поднимались очень медленно. (Поскольку многие объекты перерабатываются до того, как они достигнут старого поколения), частота выполнения CMS очень низкая, и он выполняется только один раз в несколько часов. Таким образом, сервер не нужно перезапускать.

-Xmx4000M -Xms4000M -Xmn600M -XX:PermSize=500M -XX:MaxPermSize=500M -Xss256K -XX:+DisableExplicitGC -XX:SurvivorRatio=1 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128M -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:log/gc.log

Формула связи между значением CMSInitiatingOccupancyFraction и Xmn

Акция представлена ​​выше Причина сбоя заключается в том, что при недостаточном пространстве EDEN, EDEN и From Объекты выживания в Survivor хранятся в To Находясь в зоне выживания, В зоне выживания недостаточно места, и она снова становится старой. область гена, пока старый Продвижение происходит, когда в области gen недостаточно памяти. не удалось, что привело к полному gc. Отсюда можно сделать вывод: eden+from. survivor < old Если в области гена осталась память, повышение не появится. Ситуация неудачи: (Xmx-Xmn)*(1-CMSInitiatingOccupancyFraction/100)>=(Xmn-Xmn/(SurvivorRatior+2)) Тогда делается вывод, что:

CMSInitiatingOccupancyFraction <=((Xmx-Xmn)-(Xmn-Xmn/(SurvivorRatior+2)))/(Xmx-Xmn)*100

Например:

Когда хмх=128 xmn=36 Когда SurvivorRatio=1 CMSInitiatingOccupancyFraction<=((128.0-36)-(36-36/(1+2)))/(128-36)*100 =73.913

Когда хмх=128 xmn=24 Когда SurvivorRatio=1 CMSInitiatingOccupancyFraction<=((128.0-24)-(24-24/(1+2)))/(128-24)*100=84.615…

Когда xmx=3000 xmn=600 Когда SurvivorRatio=1 CMSInitiatingOccupancyFraction<=((3000.0-600)-(600-600/(1+2)))/(3000-600)*100=83.33

CMSInitiatingOccupancyFraction ниже 70%. Необходимо изменить значение xmn или SurvivorRatior.

делать:

Детская обувь онлайнВыведенная формула::(Xmx-Xmn)*(100-CMSInitiatingOccupancyFraction)/100>=Xmn Лично я считаю, что эта формула не очень строгая и повлияет на расчет xmn при небольшом объеме памяти.

О реальной обстановкеGCпараметр Конфигурация Видеть:Анализ случая Инструменты мониторинга см. в разделе Мониторинг JVM.

7. Пример:

1、-Xbootclasspath пример:Параметр -Xbootclasspath, Java Как установить путь к классам при запуске приложения с параметром -jar

2、-XX:-HeapDumpOnOutOfMemoryError Пример:Параметры JVM -XX:+HeapDumpOnOutOfMemoryError (экспортировать информацию о куче переполнения памяти (файл hprof))

3、-verboseПример:Заказ Просмотр файлов байт-кода класса Java, подробный, синхронизация

4、-XX:Пример MaxMetaspaceSize:Мат №3 — Перм Ген Анализ памяти постоянного поколения Metaspace

5、-XssПример:Понимание внутренней архитектуры виртуальной машины Java

6、-XX:+PrintGCDetails Анализ журнала GC (jdk1.8)

7、gc中изпараметр Пример:GC Анализ алгоритмов и знакомство с различными сборщиками мусора

Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/127149.html Исходная ссылка: https://javaforall.cn

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose