Если я опущу -Xmxn
опцию в командной строке Java, то будет использоваться значение по умолчанию. Согласно документации Java
«значение по умолчанию выбирается во время выполнения в зависимости от конфигурации системы»
Какие параметры конфигурации системы влияют на значение по умолчанию?
java
heap
heap-memory
Ричард Дорман
источник
источник
Ответы:
В Windows вы можете использовать следующую команду, чтобы узнать значения по умолчанию в системе, где работают ваши приложения.
Ищите варианты
MaxHeapSize
(для-Xmx
) иInitialHeapSize
для-Xms
.В системе Unix / Linux вы можете сделать
Я считаю, что полученный результат в байтах.
источник
InitialHeapSize = 262803264
аMaxHeapSize = 4206886912
это около 256 МБ и 4 ГБ, если я не ошибаюсь. Означает ли это, что каждая JVM запускается так, как если бы она была запущена с-Xms256m -Xmx4g
опциями?java -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
-version
подавлен длинный текст «использования»stderr
.Для Java SE 5: в соответствии с эргономикой сборщика мусора [Oracle] :
ОБНОВИТЬ:
Как отметил Том Андерсон в своем комментарии, вышеизложенное относится к машинам серверного класса. Из эргономики в виртуальной машине JavaTM 5.0 :
источник
Java 8 занимает больше , чем 1 / 64th вашей физической памяти для Xmssize (Минимальное HeapSize) и менее чем 1/4 от вашей физической памяти для вашего -Xmxsize (Maximum HeapSize).
Вы можете проверить размер кучи Java по умолчанию :
В Windows :
В Linux :
Физическая память машины и версия Java.
источник
Это изменено в Java 6 обновление 18 .
Если предположить, что у нас более 1 ГБ физической памяти (довольно часто в наши дни), это всегда 1/4 вашей физической памяти для сервера vm.
источник
greater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes
Эрнесто прав. По ссылке он разместил [1]:
[1] http://www.oracle.com/technetwork/java/javase/6u18-142093.html
источник
Для IBM JVM эта команда выглядит следующим образом:
Дополнительная информация о IBM SDK для Java 8: http://www-01.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.java.lnx.80.doc/diag/appendixes/defaults.html. ? Ланг = еп
источник
В заключение!
Начиная с Java 8u191 у вас теперь есть варианты:
это можно использовать для определения размера кучи в процентах от используемой физической памяти. (что совпадает с установленной оперативной памятью меньше, чем использует ядро).
См. Примечания к выпуску для Java8 u191 для получения дополнительной информации. Обратите внимание, что параметры упоминаются под заголовком Docker, но на самом деле они применяются независимо от того, находитесь ли вы в среде Docker или в традиционной среде.
Значение по умолчанию для
MaxRAMPercentage
25%. Это крайне консервативно.Мое собственное правило: если ваш хост более или менее выделен для запуска данного Java-приложения, то вы можете без проблем значительно увеличить его. Если вы работаете в Linux, работаете только со стандартными демонами и устанавливаете оперативную память где-то около 1 Гб и более, тогда я без колебаний использую 75% для кучи JVM. Опять же, помните, что это 75% доступной оперативной памяти , а не установленной . Остаются другие процессы пользователя земли, которые могут выполняться на хосте, и другие типы памяти, которые нужны JVM (например, для стека). Все вместе, это обычно хорошо вписывается в оставшиеся 25%. Очевидно, что при еще большем объеме установленной оперативной памяти ставка 75% безопаснее и безопаснее. (Я бы хотел, чтобы ребята из JDK реализовали опцию, в которой вы могли бы указать лестницу)
Настройка
MaxRAMPercentage
опции выглядит следующим образом:Обратите внимание, что эти процентные значения имеют тип 'double', и поэтому вы должны указывать их с десятичной точкой. Вы получите несколько странную ошибку, если вы используете «75» вместо «75.0».
источник
Посмотрите на странице документации
Начальный и максимальный размеры кучи клиентской JVM по умолчанию:
Максимальный размер кучи по умолчанию составляет половину физической памяти до объема физической памяти 192 мегабайта (МБ) и в противном случае четверть физической памяти - до объема физической памяти 1 гигабайт (ГБ) .
Начальный и максимальный размеры кучи сервера JVM по умолчанию:
В 32-разрядных JVM максимальный размер кучи по умолчанию может составлять до 1 ГБ, если имеется 4 ГБ или более физической памяти . На 64-разрядных виртуальных машинах JVM максимальный размер кучи по умолчанию может составлять до 32 ГБ, если объем физической памяти составляет 128 ГБ или более.
Вы можете указать начальный и максимальный размеры кучи, используя флаги -Xms (начальный размер кучи) и -Xmx (максимальный размер кучи). Если вы знаете , сколько кучи ваше приложение должно работать хорошо, вы можете установить -Xms и -Xmx к тому же значению
источник
Xms
ИXmx
являются флаг виртуальной машины Java (JVM):Xms
:initial and minimum
JVMheap size
Format
:-Xmx<size>[g|G|m|M|k|K]
Default Size
:-server
режим: 25% свободной физической памяти,> = 8 МБ и <= 64 МБ-client mode
: 25% свободной физической памяти,> = 8 МБ и <= 16 МБTypical Size
:-Xms128M
-Xms256M
-Xms512M
Function
/Effect
:Xms
памятиXmx
:maximum
JVMheap size
Format
:-Xmx<size>[g|G|m|M|k|K]
Default Size
:<= R27.2
Windows
:75%
от общей физической памяти до1GB
Linux/Solaris
:50%
из доступной физической памяти до1GB
>= R27.3
Windows X64
:75%
от общей физической памяти до2GB
Linux/Solaris X64
:50%
из доступной физической памяти до2GB
Windows x86
:75%
от общей физической памяти до1GB
Linux/Solaris X86
:50%
из доступной физической памяти до1GB
Typical Size
:-Xmx1g
-Xmx2084M
-Xmx4g
-Xmx6g
-Xmx8g
Function
/Effect
:Xmx
размер памятиXmx
, будетjava.lang.OutOfMemoryError
OutOfMemoryError
?Xmx
значение-Xmx4g
до-Xmx8g
Подробнее
смотрите официальный документ: -X Опции командной строки
источник
Ряд параметров влияет на размер генерации. Следующая диаграмма иллюстрирует разницу между выделенным пространством и виртуальным пространством в куче. При инициализации виртуальной машины все пространство для кучи резервируется. Размер зарезервированного пространства можно указать с помощью
-Xmx
опции. Если значение-Xms
параметра меньше значения-Xmx
параметра, не все зарезервированное пространство немедленно выделяется для виртуальной машины. На этой фигуре незафиксированное пространство обозначено как «виртуальное». Различные части кучи (постоянное поколение, постоянное поколение и молодое поколение) могут увеличиваться до предела виртуального пространства по мере необходимости.По умолчанию виртуальная машина увеличивает или уменьшает кучу в каждой коллекции, чтобы попытаться сохранить пропорцию свободного пространства для живых объектов в каждой коллекции в пределах определенного диапазона. Этот целевой диапазон задается в процентах параметрами -
XX:MinHeapFreeRatio=<minimum>
и-XX:MaxHeapFreeRatio=<maximum>
, а общий размер ограничен снизу-Xms<min>
и выше символом-Xmx<max>
.Значение параметра по умолчанию
MinHeapFreeRatio 40
MaxHeapFreeRatio 70
-Xms 3670k
-Xmx 64 м
Значения по умолчанию параметров размера кучи в 64-разрядных системах были увеличены примерно на 30%. Это увеличение предназначено для компенсации большего размера объектов в 64-битной системе.
С этими параметрами, если процент свободного пространства в поколении падает ниже 40%, поколение будет расширено, чтобы сохранить 40% свободного пространства, вплоть до максимально допустимого размера поколения. Точно так же, если свободное пространство превышает 70%, генерация будет сокращена, так что только 70% пространства будет свободным, при условии минимального размера генерации.
Большие серверные приложения часто испытывают две проблемы с этими значениями по умолчанию. Один из них - медленный запуск, потому что начальная куча мала и должна быть изменена во многих основных коллекциях. Более насущная проблема заключается в том, что максимальный размер кучи по умолчанию неоправданно мал для большинства серверных приложений. Практические правила для серверных приложений:
Как правило, увеличивайте объем памяти по мере увеличения числа процессоров, поскольку распределение может быть распараллелено.
Есть полная статья
источник