Глубокое понимание виртуальной машины JavaВсе статьи цикла обновляются...
- Глубокое понимание виртуальной машины Java - тщательный анализ области памяти Java
- Глубокое понимание виртуальной машины Java - анализ общих параметров виртуальной машины
- Глубокое понимание принципа стратегии распределения и восстановления памяти виртуальной машины Java и JVM, а также прощание с неграмотностью распределения памяти JVM.
- Как использовать производительность виртуальной машины JDK поставляется с инструментами командной строки для мониторинга миллионов одновременных высоких глубин понимания виртуальной машины Java
- Глубокое понимание виртуальной машины Java — как использовать VisualVM для анализа производительности проектов с большим количеством параллельных операций.
- Глубокое понимание виртуальной машины Java - понимаете ли вы принцип алгоритма GC
Нечего сказать, сегодня я проанализирую настройки параметров некоторых часто используемых виртуальных машин 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, обратите на нас внимание и вы многого добьетесь!