Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.
Ссылка:[#link](https://www.cnblogs.com/duanxz/p/3482366.html)
Один из них — стандартный параметр (-). Все реализации 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().
многословный -verbose:класс Вывод соответствующей информации о классах, загруженных jvm. Это можно использовать для диагностики, когда jvm сообщает, что класс не может быть найден или существует конфликт классов.
-verbose:gc Выведите соответствующую информацию о каждом GC.
-verbose:jni Выведите соответствующую ситуацию вызова собственного метода, который обычно используется для диагностики информации об ошибках вызова jni.
Заказ Просмотр файлов байт-кода класса Java, подробный, синхронизация
Ссылка::[#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: неограниченно.
Список параметров с префиксом -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 | Отслеживание информации об ограничениях загрузчика классов |
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
Будь то 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.
Вообще говоря, серверные приложения будут иметь следующие правила:
2. The Young Generation
Еще одним фактором, влияющим на бесперебойную работу приложения, является численность молодого поколения. Чем больше молодое поколение, тем меньше второстепенных коллекций; но при фиксированном размере кучи более крупное молодое поколение означает меньшее постоянное поколение, что означает больше крупных коллекций (крупные коллекции вызывают второстепенные коллекции).
NewRatio отражает соотношение численности молодых и постоянных поколений. NewSize и MaxNewSize отражают нижний и верхний пределы размера молодого поколения. Установка одинаковых значений для этих двух значений зафиксирует размер молодого поколения (так же, как установка одинаковых значений для Xms и Xmx).
При желании SurvivorRatio также может оптимизировать размер выжившего, но на производительность это не оказывает большого влияния. SurvivorRatio — это соотношение между Эдемом и выжившим.
Вообще говоря, серверные приложения будут иметь следующие правила:
опыт&&правило
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.
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