Java — что такое параметр -Xms и -Xmx?
В Java -Xms установить начальный размер кучи Java, в то время как -Xmx установить максимальный размер кучи Java.
1. Некоторые java -Xms -Xmx Примеры :
# Start with 128MB of memory, and allow the Java process to use up to 1024MB of memory. java -Xms128m -Xmx1024m
# Start with 256MB of memory, and allow the Java process to use up to 4G (4096MB) of memory. java -Xms256m -Xmx4g
2. Исходный и максимальный размер кучи Java по умолчанию назначается на основе этого алгоритма эргономики , также прочитайте эту статью — Узнайте свой объем памяти кучи Java
3. Если процесс Java превысил -Xmx максимальный размер кучи Java, популярный java.lang.OutOfMemoryError будет брошен.
4. Для других вариантов запустите java -X
> java -X -Xbatch disable background compilation -Xbootclasspath/a: append to end of bootstrap class path -Xcheck:jni perform additional checks for JNI functions -Xcomp forces compilation of methods on first invocation -Xdebug provided for backward compatibility -Xdiag show additional diagnostic messages -Xfuture enable strictest checks, anticipating future default -Xint interpreted mode execution only -Xinternalversion displays more detailed JVM version information than the -version option -Xloggc: log GC status to a file with time stamps -Xmixed mixed mode execution (default) -Xmn sets the initial and maximum size (in bytes) of the heap for the young generation (nursery) -Xms set initial Java heap size -Xmx set maximum Java heap size -Xnoclassgc disable class garbage collection -Xrs reduce use of OS signals by Java/VM (see documentation) -Xshare:auto use shared class data if possible (default) -Xshare:off do not attempt to use shared class data -Xshare:on require using shared class data, otherwise fail. -XshowSettings show all settings and continue -XshowSettings:all show all settings and continue -XshowSettings:locale show all locale related settings and continue -XshowSettings:properties show all property settings and continue -XshowSettings:vm show all vm related settings and continue -XshowSettings:system (Linux Only) show host system or container configuration and continue -Xss set java thread stack size -Xverify sets the mode of the bytecode verifier
Рекомендации
- Настройка виртуальных машин Java (JVM)
- Затмение -Xms / -Xmx
- алгоритм эргономики
- Узнайте свой объем памяти кучи Java
Параметры -Xms и -Xmx при запуске JVM
Часто при работе с Java разработчики сталкиваются с такими параметрами запуска JVM, как -Xms и -Xmx . Они отвечают за управление памятью в виртуальной машине Java и могут существенно повлиять на производительность и стабильность работы приложения.
Что такое -Xms и -Xmx ?
Параметр -Xms задает начальный размер (в байтах) кучи, которую JVM выделяет при старте приложения. Это важно, поскольку недостаток памяти при старте может привести к тому, что приложение будет работать медленно или вообще не сможет запуститься.
Параметр -Xmx , наоборот, задает максимальный размер (также в байтах) кучи. Если приложение пытается использовать больше памяти, чем задано параметром -Xmx , то JVM может выбросить исключение OutOfMemoryError .
Пример использования
java -Xms128m -Xmx1024m MyApplication
В этом примере при запуске приложения MyApplication виртуальная машина Java выделит начально 128 мегабайт памяти, а максимальный размер кучи составит 1024 мегабайт (или 1 гигабайт).
Значения по умолчанию
Значения параметров -Xms и -Xmx по умолчанию зависят от конкретной реализации JVM и могут варьироваться. Обычно начальный размер кучи составляет несколько десятков мегабайт, а максимальный — от половины до четверти от всего доступного объема оперативной памяти.
Заключение
Правильное использование параметров -Xms и -Xmx может существенно улучшить производительность и стабильность работы Java-приложений. Однако следует помнить, что задание слишком большого объема памяти может привести к неэффективному использованию ресурсов и замедлению работы всей системы.
Java Blog
Если вы являетесь Java-разработчиком или администратором Java приложения, вам поможет в работе знание того, что означают опции JVM, а также их важность и как они влияют на ваше приложение.
Обзор параметров JVM
Если говорить о параметрах JVM, то есть три типа параметров, которые вы можете включить в JVM: стандартные, нестандартные и расширенные параметры. Если вы используете расширенную опцию, вы всегда используете опцию с -XX. Точно так же, если вы применяете нестандартную опцию, вы используете -X. Стандартные опции ничего не добавляют к опции.
Какие параметры JVM используются вашим приложением?
Если приложение работает в Linux, вы можете использовать
ps -ef | grep java
для идентификации процесса Java и просмотра параметров JVM, напечатанных как аргументы процесса. Если в системе выполняется более одного Java-процесса, вам может потребоваться использовать ключевое слово, уникальное для вашего Java-приложения.
Если ваш аргумент слишком длинный, попробуйте использовать
ps -auxww | grep java
так как эта команда также покажет длинный список аргументов.
Имея список флагов JVM, вы можете получить представление о поведении любого Java-приложения, например Tomcat.
1. Размер кучи (heap) Java
-Xms - установить начальный размер кучи Java -Xmx - установить максимальный размер кучи Java -Xss - установить размер стека Java-потока (java thread stack)
-Xms — эта опция определяет начальный размер кучи для JVM, например, Xms2048m, что означает, что начальный размер кучи JVM составляет около 2 ГБ. Итак, когда JVM запускается, куча памяти будет очень большой. Это делается для предотвращения изменения размера во время запуска и увеличения времени запуска JVM.
-Xmx — этот параметр определяет максимальный размер кучи JVM, например, Xmx2048m, что означает, что максимальный размер кучи JVM будет составлять только 2 ГБ.
По сути, вы всегда будете иметь -Xms и -Xmx вместе.
2. Задание процента кучи
-XX:MaxHeapFreeRatio — устанавливает максимальный процент свободного пространства кучи после GC (Garbage Collecting, сборки мусора), чтобы избежать сжатия.
-XX:MinHeapFreeRatio — устанавливает минимальный процент свободного пространства кучи после GC, чтобы избежать расширения; для мониторинга использования кучи вы можете использовать JConsole.
3. Включить обмен данными класса
Укажите опцию Xshareclasses, чтобы включить общий доступ к данным класса в общем кэше классов. JVM подключается к существующему кэшу или создает кэш, если он не существует. У вас может быть несколько кэшей, и вы можете указать правильный кэш, добавив подопцию в опцию -Xshareclasses.
4. PermGen размер
Ранее параметры JVM определяли размер кучи памяти, но -XX:PermSize — для определения размера пространства PermGen, в котором сохраняются пул строк и метаданные класса. Этот параметр особенно эффективен для веб-сервера, такого как Tomcat, который часто загружает классы веб-приложения во время развертывания.
Кстати, стоит понимать, что пространство PermGen занято Metaspace в Java 8, и этот параметр неприменим, если вы работаете с JRE 8 JVM.
5. Распечатать GC (Garbage Collector)
-verbose:gc - регистрирует, запуски сборщика мусора и сколько времени они занимают. -XX:+PrintGCDetails - включает в себя данные из -verbose:gc, но также добавляет информацию о размере нового поколения и более точных временных параметрах. -XX:-PrintGCTimeStamps - печатать метки времени при сборке мусора.
Эти параметры JVM используются для включения ведения журнала сбора мусора, что очень эффективно для чувствительной к задержке операции. Обычно работа идет в системах, где ведется поиск задержек в микросекундах, но большая сборка мусора может длиться несколько миллисекунд.
Эта удобная опция подскажет вам важную статистику GC. Станет известно, будет ли это большая или небольшая сборка мусора, какой тип сборщика мусора применяется, как часто восстанавливается память, сколько времени он занимал и т.д.
6. Обработка ошибки «OutOfMemory»
Чтобы вызвать дамп кучи при нехватке памяти, вы можете использовать -XX:+HeapDumpOnOutOfMemoryError
Эта опция JVM создает дамп стека, когда ваша JVM завершается с ошибкой OutOfMemory. Там нет никаких затрат, если ошибка OutOfMemory действительно не происходит. Этот флаг является обязательным для производственных систем, поскольку обычно это единственный способ глубоко определить проблему.
Дамп кучи будет установлен в «текущем каталоге» JVM по умолчанию. Если вы хотите создать дамп кучи в определенном каталоге, запустите
-XX:HeapDumpPath=[путь к каталогу дампа кучи] -XX:+UseGCOverheadLimit -XX:OnOutOfMemoryError="; "
Файл дампа кучи может быть огромного размера, вплоть до гигабайт, поэтому убедитесь, что целевая файловая система обеспечивает достаточную емкость.
Если мы хотим перезапустить сервер сразу после возникновения нехватки памяти, мы можем установить этот параметр с той же целью:
XX:OnOutOfMemoryError="shutdown -r"
7. Trace загрузки классов и выгрузки
-XX:+TraceClassLoading и -XX:+TraceClassUnloading — это две опции JVM, которые мы используем для печати информации журналов всякий раз, когда классы загружаются в JVM или выгружаются из JVM. Эти флаги JVM полезны, если у вас есть какой-либо тип утечки памяти, связанный с загрузчиком классов и есть подозрение, что классы не выгружаются или не собирается мусор.
8. Java classpath (путь к классу)
Говоря о Java Classpath а затем -Xbootclasspath определяет записи classpath, которые мы хотим загрузить без проверки. JVM проверяет все классы, которые она загружает, чтобы убедиться, что она не пытается разыменовать объект с помощью int, выталкивает дополнительные записи из стека или выталкивает слишком много, и так далее.
Помещение class в bootclasspath также снижает стоимость, но его следует использовать только тогда, когда вы знаете, что классы проверялись много раз раньше. В JRuby это сократило время запуска вдвое и более для простого скрипта.
9. Профилирование
Java профилирование — это процесс мониторинга различных параметров уровней JVM, таких как выполнение методов, выполнение потоков, сборка мусора и создание объектов. Java профилирование обеспечивает более точное представление о выполнении целевого приложения и использовании его ресурсов.
-Xprof -Xrunhprof
10. 64-битная среда
В среде ОС, в которой установлены 32- и 64-разрядные пакеты, JVM автоматически выбирает 32-разрядные пакеты среды по умолчанию.
Если мы хотим установить 64-битную среду вручную, мы можем сделать это с помощью параметра -d . OS bit может быть 32 или 64.
What are the -Xms and -Xmx parameters when starting JVM?
when using -Xmx128m -Xms64m it can peak around 275m RES mem, but when using -Xmx128m -Xms128m it can peak around 550m RES mem Using Java 8 Best thing is to stress the GC and look at what happens .
Feb 20, 2018 at 16:03
Just being curious, the 275m and 550m — How were they calculated?
Jan 14, 2021 at 12:38
Default values see stackoverflow.com/questions/4667483/…
Feb 23, 2022 at 23:13
5 Answers 5
The flag Xmx specifies the maximum memory allocation pool for a Java Virtual Machine (JVM), while Xms specifies the initial memory allocation pool.
This means that your JVM will be started with Xms amount of memory and will be able to use a maximum of Xmx amount of memory. For example, starting a JVM like below will start it with 256 MB of memory and will allow the process to use up to 2048 MB of memory:
java -Xms256m -Xmx2048m
The memory flag can also be specified in different sizes, such as kilobytes, megabytes, and so on.
-Xmx1024k -Xmx512m -Xmx8g
The Xms flag has no default value, and Xmx typically has a default value of 256 MB. A common use for these flags is when you encounter a java.lang.OutOfMemoryError .
When using these settings, keep in mind that these settings are for the JVM’s heap, and that the JVM can and will use more memory than just the size allocated to the heap. From Oracle’s documentation:
Note that the JVM uses more memory than just the heap. For example Java methods, thread stacks and native handles are allocated in memory separate from the heap, as well as JVM internal data structures.
3,069 2 2 gold badges 25 25 silver badges 40 40 bronze badges
answered Feb 7, 2013 at 23:29
hexacyanide hexacyanide
89.2k 31 31 gold badges 159 159 silver badges 162 162 bronze badges
So is it like when memory usage exceeds beyond Xmx we get jvm out of memory exception.
Feb 7, 2013 at 23:41
Yes, that’s correct. When it tries to exceed that, although it may collect garbage to try to free up enough memory. If there still isn’t enough memory to satisfy the request and the heap has already reached the maximum size, an OutOfMemoryError will occur.
Oct 10, 2013 at 17:38
When I’m using the ForkJoin framework my computer crashes because it’s taking up too much memory. Is it possible that on OpenJDK there is no hard limit on the memory by default?
May 26, 2014 at 13:33
As clarified at Does java -Xmx 1G mean 1 GB or 2^30 B?, the unambiguous way to express how much memory you start with via -Xms256m is «256 MiB», not «256 MB», since it goes by binary powers rather than powers of ten. See en.wikipedia.org/wiki/Binary_prefix. In addition, because some unusable space is set aside for an extra pool of Survivor space, the amount of memory actually available according to Runtime.getRuntime().maxMemory() is less than the value specified via -Xmx
Sep 30, 2015 at 5:20
Dec 15, 2015 at 15:32
Run the command java -X and you will get a list of all -X options:
C:\Users\Admin>java -X -Xmixed mixed mode execution (default) -Xint interpreted mode execution only -Xbootclasspath: set search path for bootstrap classes and resources -Xbootclasspath/a: append to end of bootstrap class path -Xbootclasspath/p: prepend in front of bootstrap class path -Xdiag show additional diagnostic messages -Xnoclassgc disable class garbage collection -Xincgc enable incremental garbage collection -Xloggc: log GC status to a file with time stamps -Xbatch disable background compilation -Xms set initial Java heap size. -Xmx set maximum Java heap size. -Xss set java thread stack size -Xprof output cpu profiling data -Xfuture enable strictest checks, anticipating future default -Xrs reduce use of OS signals by Java/VM (see documentation) -Xcheck:jni perform additional checks for JNI functions -Xshare:off do not attempt to use shared class data -Xshare:auto use shared class data if possible (default) -Xshare:on require using shared class data, otherwise fail. -XshowSettings show all settings and continue -XshowSettings:all show all settings and continue -XshowSettings:vm show all vm related settings and continue -XshowSettings:properties show all property settings and continue -XshowSettings:locale show all locale related settings and continue
The -X options are non-standard and subject to change without notice.
I hope this will help you understand Xms , Xmx as well as many other things that matters the most. 🙂