Глубокое понимание виртуальной машины Java - анализ общих параметров виртуальной машины

Java

Глубокое понимание виртуальной машины JavaВсе статьи цикла обновляются...

Нечего сказать, сегодня я проанализирую настройки параметров некоторых часто используемых виртуальных машин Java и то, как их лучше использовать!

1 Введение в параметры JVM

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

В параметрах виртуальной машины Java эти параметры фактически можно разделить на три категории.Конечно, это для JDK1.6.Если для JDK1.8, то он не классифицируется таким образом.Однако из-за эти два. Разница между многими часто используемыми параметрами версии невелика, поэтому в этой статье сначала будут представлены параметры виртуальной машины JDK1.6.

Его можно разделить на следующие три категории:

  • 标准参数(-), все реализации JVM должны реализовывать функциональность этих параметров и быть обратно совместимыми.
  • 非标准参数(-X), JVM по умолчанию реализует функции этих параметров, но не гарантируется, что они удовлетворят все реализации JVM, и не гарантируется обратная совместимость.
  • 非Stable参数(-XX), такие параметры будут разными для каждой реализации JVM и могут быть отменены в любой момент в будущем, поэтому их нужно использовать осторожно.

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

2 стандартных параметра

Можно сказать, что этот тип параметра представляет собой множество параметров, которые мы использовали с самого начала Java, напримерjava -version,java -jarИ так далее, вводим в CMDjava -helpВы можете получить все стандартные параметры текущей версии Java.

На приведенном выше рисунке показаны все стандартные параметры JDK1.8 Ниже мы представим некоторые параметры, которые будем использовать в дальнейшем.

  • -client

Запустите JVM в клиентском режиме.Этот метод имеет высокую скорость запуска, но производительность во время выполнения и эффективность управления памятью не высоки.Он подходит для клиентских программ или разработки и отладки.

  • -server

Запустите JVM в режиме сервера, что является полной противоположностью клиентскому режиму. Подходит для производственных сред, подходит для серверов. 64-битные JVM автоматически запускаются в режиме сервера.

  • -classpath или -cp

Уведомляет JVM пути поиска класса. Если указано-classpath, JVM игнорируетCLASSPATHпуть указан в . Разделяйте пути точкой с запятой. если-classpathиCLASSPATHЕсли ни один из них не указан, JVM ищет класс по текущему пути.

Порядок пути поиска JVM:

1. Сначала найдите пакет jar или zip, который поставляется с JVM.

Bootstrap, можно использовать путь поискаSystem.getProperty("sun.boot.class.path")получить;

2. ПоискJRE_HOME/lib/extбаночка пакет под.

Расширение, путь поиска можно использоватьSystem.getProperty("java.ext.dirs")получить;

3. Поиск в заданном пользователем каталоге в следующем порядке: текущий каталог (.), ПУТЬ К КЛАССУ, -cp.

для пути поискаSystem.getProperty("java.class.path")получить.

System.out.println(System.getProperty("sun.boot.class.path"));
System.out.println(System.getProperty("java.ext.dirs"));
System.out.println(System.getProperty("java.class.path"));

Выше приведен путь к JVM моего компьютера.

  • -DpropertyName=value

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

дополнительно использоватьSystem.getProperty("hello")Вы можете получить эти определенные значения атрибутов, которые также можно использовать в коде.System.setProperty("hello","world")Форма для определения свойств.

Например, пара ключа-значение устанавливается на Hello = World.

System.out.println(System.getProperty("hello"));

Результат бега таков:

  • -verbose

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

Кроме того, консольВывод информации GCВы также можете использовать следующую команду:

Добавить в параметры запуска JVM-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTimeи вывести краткую информацию о GC, подробную информацию о GC, информацию о времени GC и время паузы приложения, вызванное GC, в порядке параметров.

3 Нестандартные параметры

Непомеченные параметры в основном относятся к настройке параметров области памяти Java, поэтому, прежде чем смотреть на эти параметры, вам следует проверить базовые знания об области памяти Java, вы можете проверить эту статью:Глубокое понимание виртуальной машины Java - тщательный анализ области памяти Java.

Нестандартные параметры — это некоторые расширенные параметры, основанные на стандартных параметрах.Вы можете ввестиjava -X, чтобы получить нестандартные параметры, поддерживаемые текущей JVM.

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

  • -Xmn

Максимальный размер памяти нового поколения, включая сумму области E и двух областей S. Метод настройки:-Xmn512m、-Xmn2g.

  • -Xms

Начальный размер кучи, минимальный размер кучи, значение по умолчанию — общая физическая память / 64 (и менее 1G). По умолчанию, когда меньше 40% доступной памяти кучи, память кучи начнет увеличиваться, она имеет увеличенный размер -Xmx.

  • -Xmx

Максимальное значение кучи. Значение по умолчанию - общая физическая память / 64 (и менее 1G). По умолчанию, когда доступная память в куче превышает 70%, память кучи начнет уменьшаться до тех пор, пока она не достигла размер -xms.

Поэтому, чтобы избежать этого плавания, установите-Xmsи-XmxПараметры обычно устанавливаются одинаковыми, что может повысить производительность.

Кроме того, официальная конфигурация по умолчаниюРазмер старого поколения: размер молодого поколения = 2:1левый и справа, используйте-XX:NewRatioМожно задать соотношение старого поколения к молодому, например,-XX:NewRatio=4,ВыражатьСтарое поколение: Молодое поколение = 4:1

Экземпляр параметра

настраивать-Xms,-Xmnи-XmxПараметры-Xms512m -Xmx512m -Xmn128m. При этом установите соотношение нового поколения к старому на 1:4, а E:S0:S1=8:1:1.

**
 * @ClassName MethodTest
 * @Description vm参数设置:-Xms512m -Xmx512m -Xmn128m -XX:NewRatio=4 -XX:SurvivorRatio=8 
 * @Author 欧阳思海
 * @Date 2019/11/25 20:06
 * @Version 1.0
 **/

public class MethodTest {

    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        long i = 0;
        while (i < 1000000000) {
            System.out.println(i);
            list.add(String.valueOf(i++).intern());
        }
    }
}

После запуска используйте VisualVM, чтобы проверить правильность соответствующей информации.

когда мынет настройки-XX:NewRatio=4 -XX:SurvivorRatio=8При использовании официальной ситуации по умолчанию ситуация выглядит следующим образом:

Как видно из приведенного выше рисунка,Новое поколение (Eden Space + Survivor 0 + Survivor 1): Old Gen ≈ 1:2.

когда мыуже настроен-XX:NewRatio=4 -XX:SurvivorRatio=8, ситуация следующая:

сталНовое поколение (Eden Space + Survivor 0 + Survivor 1): Old Gen ≈ 1:4, Пространство Эдема: Выживший 0: Выживший 1 = 8:1:1.

Как видно из приведенного выше рисунка, информация о куче верна.

  • -Xss

Установите стековую память каждого потока, по умолчанию 1M, что обычно не нужно менять.

  • -Xprof

Трассировка работающей программы и вывод данных трассировки в стандартный вывод; подходит для отладки в среде разработки.

  • -Xnoclassgc

Отключите сборку мусора класса и выключите функцию gc для класса; поскольку это предотвращает освобождение памяти, это может вызвать ошибку OutOfMemoryError, используйте ее с осторожностью.

  • -Xincgc

Включить инкрементный сборщик мусора (по умолчанию отключено); это помогает уменьшить паузы приложения во время длительного сбора мусора; однако, поскольку он может выполняться одновременно с приложением, это снизит вычислительную мощность ЦП для приложения.

  • -Xloggc:file

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

  • -Xint

В интерпретируемом режиме-XintФлаг заставляет JVM выполнять весь байт-код, что замедляет работу, часто в 10 и более раз.

  • -Xcomp

Параметр -Xcomp противоположен ему (-Xint), JVM скомпилирует все байт-коды в собственный код при первом использовании, что приведет к максимальной оптимизации.

Однако многие приложения используют-XcompТакже будет некоторая потеря производительности, которая, конечно, меньше, чем с -Xint, потому что-xcompНе включена JVMJITПолные возможности компилятора. Компилятор JIT может решить, нужно ли его компилировать или нет.Если весь код скомпилирован, это не имеет смысла для некоторого кода, который выполняется только один раз.

  • -Xmixed

-XmixedЭто смешанный режим, который является режимом по умолчанию JVM и рекомендуемым режимом. JVM может смешивать интерпретируемые и скомпилированные режимы.

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

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

Эти параметры можно условно разделить на три категории:

  • Параметры производительности: используются для настройки производительности JVM и управления распределением памяти, например для инициализации параметров размера памяти;
  • Параметры поведения: используются для изменения основного поведения JVM, такого как выбор метода GC и алгоритма;
  • Параметры отладки (Debugging Options): используются для мониторинга, печати, вывода и других параметров jvm, используются для отображения более подробной информации jvm;

Ниже приведен список некоторых наиболее часто используемых параметров.На самом деле таких статей очень много.Вот краткое содержание.В будущем будет удобнее читать статьи самостоятельно.

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

Примечание. Для JDK1.7 и более ранних версий доступны следующие параметры.

  • Параметры производительности
Параметры и их значения по умолчанию описывать
-XX:LargePageSizeInBytes=4m Большой размер страницы для кучи Java
-XX:MaxHeapFreeRatio=70 Максимальная доля свободного места в java-куче после GC
-XX:MinHeapFreeRatio=40 Минимальная доля свободного места в java-куче после GC
-XX:MaxNewSize=size Максимальный объем памяти, который может занимать вновь сгенерированный объект
-XX:MaxPermSize=64m Максимальный объем памяти, который могут занимать объекты старого поколения
-XX:NewRatio=2 Отношение объема памяти нового поколения к объему памяти старого поколения
-XX:NewSize=2.125m Значение по умолчанию занимаемой памяти при создании объекта нового поколения
-XX:ReservedCodeCacheSize=32m Зарезервированная память, занятая кодом
-XX:ThreadStackSize=512 Установите размер стека потоков, если он равен 0, используйте системное значение по умолчанию.
-XX:+UseLargePages Используйте огромную страничную память
  • поведенческие параметры
Параметры и их значения по умолчанию описывать
-XX:+ScavengeBeforeFullGC Сборщик мусора нового поколения имеет приоритет над полным выполнением сборщика мусора.
-XX:+UseGCOverheadLimit Ограничьте долю времени, которую jvm тратит на GC, прежде чем бросать OOM
-XX:-UseParNewGC Чтобы включить этот переключатель, используйтеParNew+Serial Oldколлекционер
-XX:-UseConcMarkSweepGC использоватьParNew+CMS+Serial OldСборщик использует параллельный алгоритм обмена метками для GC для старого поколения
-XX:-UseParallelGC Чтобы включить параллельный сборщик мусора, используйтеParallelScavenge+Serial Oldколлекционер
-XX:-UseParallelOldGC Включить параллелизм для полного GC, когда-XX:-UseParallelGCЭтот элемент включается автоматически при включении.ParallelScavenge+Parallel Oldколлекционер
-XX:-UseSerialGC Включить последовательный ГХ
-XX:+UseG1GC Используйте сборщик мусора (G1)
-XX:SurvivorRatio=n Отношение размера области Эдема к площади Выживших. Значение по умолчанию – 8.
-XX:PretenureSizeThreshold=n прямо повышен до старогоРазмер объекта, После установки этого параметра этот параметр больше, чем прямой доступ объекта к старой раздаче
-XX:MaxTenuringThreshold=n доведен до старостицелевой возраст, после того, как каждый объект сохраняется в течение одного Minor GC, возраст увеличивается на 1, а когда он превышает это значение, он входит в старость. Значение по умолчанию – 15.
-XX:+UseAdaptiveSizePolicy Динамически настраивайте размер различных регионов в куче Java и возраст входа в старое поколение.
-XX:ParallelGCThreads=n Устанавливает количество процессоров, используемых параллельным сборщиком при сборе. Количество параллельных потоков сбора
-XX:MaxGCPauseMillis=n Установите максимальное время паузы для параллельного сбора
-XX:GCTimeRatio=n Задает время сборки мусора в процентах от времени выполнения программы. Формула 1/(1+N)
-XX:+UseThreadPriorities Включить собственный приоритет потока
-XX:-DisableExplicitGC Запрещено звонитьSystem.gc(); но сборщик мусора jvm все еще работает
-XX:+MaxFDLimit Максимально увеличить ограничение на количество файловых дескрипторов

Первые 6 параметров относятся куборщик мусораПараметры поведения, параметры также часто используются.

  • Параметр отладки
Параметры и их значения по умолчанию описывать
-XX:-CITime Вывести время, затраченное на JIT-компиляцию
-XX:ErrorFile=./hs_err_pid<pid>.log Сохранить журнал ошибок или данные в файл
-XX:HeapDumpPath=./java_pid<pid>.hprof Укажите путь или имя файла при экспорте информации о куче
-XX:-HeapDumpOnOutOfMemoryError Когда мы впервые столкнулись с этим временем куча информации OOM Export
-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 Печатать соответствующую информацию каждый раз, когда GC
-XX:-PrintGCDetails Печать сведений о каждом ГХ
-XX:-PrintGCTimeStamps Распечатать метку времени каждого GC
-XX:-TraceClassLoading Информация о загрузке класса отслеживания
-XX:-TraceClassLoadingPreorder Отслеживайте информацию о загрузке для всех классов, на которые есть ссылки
-XX:-TraceClassResolution Отслеживание постоянного пула
-XX:-TraceClassUnloading Информация о выгрузке класса отслеживания
-XX:-TraceLoaderConstraints Отслеживание информации об ограничениях загрузчика классов

5 параметров виртуальной машины JDK8

Учитывая, что JDK8 сейчас широко используется, подытожим некоторые параметры, которые будет использовать JDK8.

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

1,Оригинальность – это не просто, старое железо, в статье нужна вашакакПусть больше людей увидят это, я надеюсь, что это может помочь всем!

2. Если статья неуместна, поправьте меня, если вам нравится читать в WeChat, вы также можете подписаться на меня.Публичный аккаунт WeChat:好好学java, публичный аккаунт уже есть6WФанаты, ответьте:1024, получите большой подарочный пакет официального аккаунта, официальный аккаунт выйдет надолгоСерия статей Java Premium, обратите на нас внимание и вы многого добьетесь!