Как определяется размер кучи Java по умолчанию?
Если я опускаю опцию -Xmxn в командной строке Java, используется значение по умолчанию. Согласно документации Java "значение по умолчанию выбирается во время выполнения на основе конфигурации системы".
Какие параметры конфигурации системы влияют на значение по умолчанию?
8 ответов
В системах Windows вы можете использовать следующую команду, чтобы узнать значения по умолчанию в системе, где работают ваши приложения.
java -XX: + PrintFlagsFinal -version | findstr HeapSize
Ищите варианты MaxHeapSize
(за -Xmx
) а также InitialHeapSize
за -Xms
,
В системе Unix/Linux вы можете сделать
java -XX:+PrintFlagsFinal -version | grep HeapSize
Я считаю, что полученный результат в байтах.
В соответствии с эргономикой сборщика мусора [Oracle]:
начальный размер кучи:
Больше 1/64 от физической памяти машины на машине или какой-то разумный минимум. До J2SE 5.0 начальный размер кучи по умолчанию был приемлемым минимумом, который зависит от платформы. Вы можете изменить это значение по умолчанию, используя опцию командной строки -Xms.
максимальный размер кучи:
Меньше 1/4 физической памяти или 1 ГБ. До J2SE 5.0 максимальный размер кучи по умолчанию составлял 64 МБ. Вы можете переопределить это значение по умолчанию, используя опцию командной строки -Xmx.
ОБНОВИТЬ:
Как отметил Том Андерсон в своем комментарии, вышеизложенное относится к машинам серверного класса. Из эргономики в виртуальной машине JavaTM 5.0:
В платформе J2SE версии 5.0 класс машины, называемой машиной серверного класса, был определен как машина с
- 2 или более физических процессора
- 2 или более Гбайт физической памяти
за исключением 32-битных платформ, работающих под управлением операционной системы Windows. На всех других платформах значения по умолчанию такие же, как значения по умолчанию для версии 1.4.2.
В платформе J2SE версии 1.4.2 по умолчанию были сделаны следующие выборы
- начальный размер кучи 4 мегабайта
- максимальный размер кучи 64 мегабайта
Java 8 занимает более 1/6 вашей физической памяти для вашего Xmssize (Minimum HeapSize) и менее 1/4 вашей физической памяти для вашего -Xmxsize (Maximum HeapSize).
Вы можете проверить размер кучи Java по умолчанию:
В Windows:
java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
В Linux:
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
Какие параметры конфигурации системы влияют на значение по умолчанию?
Ваша физическая память и ваша версия Java.
Это изменилось с обновлением 18 Java 6.
Если предположить, что у нас более 1 ГБ физической памяти (что довольно часто встречается в наши дни), это всегда 1/4 вашей физической памяти.
В заключение!
Начиная с Java 8u191, теперь у вас есть следующие возможности:
-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage
который можно использовать для определения размера кучи в процентах от используемой физической памяти. (это то же самое, что и установленная оперативная память, за исключением того, что использует ядро).
См. Примечания к выпуску для Java8 u191 для получения дополнительной информации. Обратите внимание, что параметры упоминаются под заголовком Docker, но на самом деле они применяются независимо от того, находитесь ли вы в среде Docker или в традиционной среде.
Значение по умолчанию для MaxRAMPercentage
составляет 25%. Это крайне консервативно.
Мое собственное правило: если ваш хост более или менее посвящен запуску данного java-приложения, вы можете без проблем значительно увеличить его. Если вы работаете в Linux, используете только стандартные демоны и установили оперативную память от 1 Гб и выше, то я без колебаний использую 75% для кучи JVM. Опять же, помните, что это 75% доступной RAM, а не установленной RAM. Что осталось, так это другие пользовательские процессы, которые могут выполняться на хосте, и другие типы памяти, которые необходимы JVM (например, для стека). В целом, это обычно хорошо вписывается в оставшиеся 25%. Очевидно, что с еще большим объемом установленной оперативной памяти 75% - более безопасный вариант. (Хотелось бы, чтобы люди из JDK реализовали вариант, в котором вы могли бы указать лестницу)
Установка MaxRAMPercentage
вариант выглядит так:
java -XX:MaxRAMPercentage=75.0 ....
Обратите внимание, что эти процентные значения относятся к двойному типу, и поэтому вы должны указать их с десятичной точкой. Если вы используете "75" вместо "75.0", вы получите несколько странную ошибку.
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
:- -> JVM начать с выделения
Xms
размер памяти
- -> JVM начать с выделения
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
:- -> JVM позволяют использовать максимум
Xmx
размер памяти- когда превышать
Xmx
, будутjava.lang.OutOfMemoryError
- Как исправить
OutOfMemoryError
?- превышать
Xmx
значение- например: от
-Xmx4g
в-Xmx8g
- например: от
- превышать
- Как исправить
- когда превышать
- -> JVM позволяют использовать максимум
Более детально
смотрите официальный документ: -X Опции командной строки
Эрнесто прав. По ссылке он разместил [1]:
Обновлена конфигурация кучи клиента JVM
В клиентской JVM...
Максимальный размер кучи по умолчанию составляет половину физической памяти до объема физической памяти 192 мегабайта, а в остальном - одну четверть физической памяти до объема физической памяти 1 гигабайт.
Например, если на вашей машине установлено 128 мегабайт физической памяти, то максимальный размер кучи составляет 64 мегабайта, а если размер физической памяти больше или равен 1 гигабайту, максимальный размер кучи составляет 256 мегабайт.
Максимальный размер кучи фактически не используется JVM, если ваша программа не создает достаточно объектов, чтобы это потребовать. Гораздо меньшее количество, называемое начальным размером кучи, выделяется во время инициализации JVM....
- ...
- Эргономика конфигурации кучи JVM на сервере теперь такая же, как у клиента, за исключением того, что максимальный размер кучи по умолчанию для 32-разрядных JVM составляет 1 гигабайт, что соответствует размеру физической памяти в 4 гигабайта, а для 64-разрядной JVM - 32 гигабайта, что соответствует до физического объема памяти 128 гигабайт.
[1] http://www.oracle.com/technetwork/java/javase/6u18-142093.html
Для IBM JVM эта команда выглядит следующим образом:
java -verbose:sizes -version
Для получения дополнительной информации о 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?lang=en
значение по умолчанию выбирается во время выполнения в зависимости от конфигурации системы
Посмотрите на странице документации
Размер кучи по умолчанию
Если в командной строке не указан начальный и максимальный размеры кучи, они рассчитываются на основе объема памяти на компьютере.
Начальные и максимальные размеры кучи клиентской JVM:
Максимальный размер кучи по умолчанию составляет половину физической памяти до объема физической памяти 192 мегабайта (МБ) и в противном случае четверть физической памяти до объема физической памяти 1 гигабайт (ГБ).
Начальный и максимальный размеры кучи сервера JVM по умолчанию:
В 32-разрядных JVM максимальный размер кучи по умолчанию может составлять до 1 ГБ, если имеется 4 ГБ или более физической памяти. На 64-разрядных виртуальных машинах JVM максимальный размер кучи по умолчанию может составлять до 32 ГБ, если объем физической памяти составляет 128 ГБ или более.
Какие параметры конфигурации системы влияют на значение по умолчанию?
Вы можете указать начальный и максимальный размеры кучи, используя флаги -Xms (начальный размер кучи) и -Xmx (максимальный размер кучи). Если вы знаете, сколько кучи должно работать для вашего приложения, вы можете установить -Xms и -Xmx в одно и то же значение.
Ряд параметров влияет на размер генерации. Следующая диаграмма иллюстрирует разницу между выделенным пространством и виртуальным пространством в куче. При инициализации виртуальной машины все пространство для кучи резервируется. Размер зарезервированного пространства можно указать с помощью -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% пространства будет свободным, при условии минимального размера генерации.
Большие серверные приложения часто испытывают две проблемы с этими значениями по умолчанию. Один из них - медленный запуск, потому что начальная куча мала и должна быть изменена во многих основных коллекциях. Более насущная проблема заключается в том, что максимальный размер кучи по умолчанию неоправданно мал для большинства серверных приложений. Практические правила для серверных приложений:
- Если у вас нет проблем с паузами, попробуйте выделить виртуальной машине как можно больше памяти. Размер по умолчанию (64 МБ) часто слишком мал.
- Установка -Xms и -Xmx в одно и то же значение повышает предсказуемость, удаляя наиболее важные решения по размерам с виртуальной машины. Однако виртуальная машина не сможет компенсировать это, если вы сделаете плохой выбор.
Как правило, увеличивайте объем памяти по мере увеличения числа процессоров, поскольку распределение может быть распараллелено.
Есть полная статья