Как определяется размер кучи 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 JVM heap 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 размер памяти
  • Xmx: maximum JVM heap 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

Более детально

смотрите официальный документ: -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

значение по умолчанию выбирается во время выполнения в зависимости от конфигурации системы

Посмотрите на странице документации

Размер кучи по умолчанию

Если в командной строке не указан начальный и максимальный размеры кучи, они рассчитываются на основе объема памяти на компьютере.

  1. Начальные и максимальные размеры кучи клиентской JVM:

    Максимальный размер кучи по умолчанию составляет половину физической памяти до объема физической памяти 192 мегабайта (МБ) и в противном случае четверть физической памяти до объема физической памяти 1 гигабайт (ГБ).

  2. Начальный и максимальный размеры кучи сервера 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 в одно и то же значение повышает предсказуемость, удаляя наиболее важные решения по размерам с виртуальной машины. Однако виртуальная машина не сможет компенсировать это, если вы сделаете плохой выбор.
  • Как правило, увеличивайте объем памяти по мере увеличения числа процессоров, поскольку распределение может быть распараллелено.

    Есть полная статья

Другие вопросы по тегам