Как определяется размер кучи Java по умолчанию?

Если я опускаю опцию -Xmxn из командной строки Java, используется значение по умолчанию. Согласно документации Java "значение по умолчанию выбирается во время выполнения на основе конфигурации системы".

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

Ответ 1

В системах Windows вы можете использовать следующую команду, чтобы узнать значения по умолчанию в системе, в которой работают ваши приложения.

java -XX: + PrintFlagsFinal -version | findstr HeapSize

Ищите опции MaxHeapSize (для -Xmx) и InitialHeapSize для -Xms.

В системе Unix/Linux вы можете сделать

java -XX: + PrintFlagsFinal -version | grep HeapSize

Я считаю, что итоговый результат находится в байтах.

Ответ 2

Согласно Эргономика сборщика мусора [Oracle]:

начальный размер кучи:

Более 1/64-й физической памяти машины на машине или разумный минимум. До J2SE 5.0, начальный размер кучи по умолчанию был разумный минимум, который зависит от Платформа. Вы можете отменить это по умолчанию с использованием командной строки -Xms вариант.

максимальный размер кучи:

Меньше 1/4-й физической памяти или 1 ГБ. До J2SE 5.0 максимальный размер кучи по умолчанию - 64 МБ. Вы можете переопределить это значение по умолчанию, используя параметр командной строки -Xmx.

UPDATE:

Как отметил Том Андерсон в своем комментарии, вышесказанное относится к машинам серверного класса. Из Эргономика в виртуальной машине JavaTM 5.0:

В платформе J2SE версии 5.0 a класс машины, называемый определена машина серверного класса как машина с

  • 2 или более физических процессора
  • 2 или более Гбайт физической памяти

за исключением 32-битных платформ запуск версии Windows операционная система. По всем другим платформами значениями по умолчанию являются такие же, как значения по умолчанию для версии 1.4.2.

В платформе J2SE версии 1.4.2 на по умолчанию были выбраны следующие варианты: сделал

  • размер начальной кучи 4 Мбайт
  • максимальный размер кучи 64 Мбайт

Ответ 3

Это изменено с помощью Java 6 update 18.

Предполагая, что у нас есть более 1 ГБ физической памяти (довольно часто в эти дни), она всегда 1/4 вашей физической памяти.

Ответ 4

Эрнесто прав. Согласно ссылке, которую он опубликовал [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

Ответ 5

Java 8 занимает более 1/6-й вашей физической памяти для вашего Xmssize (Minimum HeapSize) и менее 1/4-й физической памяти для вашего -Xmxsize (Maximum HeapSize).

Вы можете проверить размер кучи по умолчанию по умолчанию:

В Windows:

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

В Linux:

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

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

Ваша физическая память и ваша версия Java.

Ответ 6

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

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

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

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

  • Стандартные и максимальные размеры кучи клиента JVM по умолчанию:

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

  • Начальные и максимальные размеры кучи сервера JVM по умолчанию:

    В 32-разрядных JVM максимальный размер кучи по умолчанию может быть до 1 ГБ, если имеется 4 ГБ или более физической памяти. В 64-разрядных JVM максимальный размер кучи по умолчанию может быть до 32 ГБ, если имеется 128 ГБ или более физической памяти

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

Вы можете указать размер начальной и максимальной кучи, используя флаги -Xms (начальный размер кучи) и -Xmx (максимальный размер кучи). Если вы знаете, сколько кучи вашего приложения должно работать хорошо, вы можете установить -Xms и -Xmx на одно и то же значение

Ответ 8

Ряд параметров влияет на размер генерации. Следующая диаграмма иллюстрирует разницу между выделенным пространством и виртуальным пространством в куче. При инициализации виртуальной машины все пространство для кучи резервируется. Размер зарезервированного пространства можно указать с -Xmx опции -Xmx. Если значение параметра -Xms меньше, чем значение параметра -Xmx, не все зарезервированное пространство немедленно выделяется виртуальной машине. На этом рисунке незафиксированное пространство обозначено как "виртуальное". Различные части кучи (постоянное поколение, постоянное поколение и молодое поколение) могут расти до предела виртуального пространства по мере необходимости.

enter image description here

По умолчанию виртуальная машина увеличивает или уменьшает кучу в каждой коллекции, чтобы попытаться сохранить пропорцию свободного пространства для живых объектов в каждой коллекции в пределах определенного диапазона. Этот целевой диапазон устанавливается в процентах с помощью параметров - XX:MinHeapFreeRatio=<minimum> и -XX:MaxHeapFreeRatio=<maximum>, а общий размер ограничен снизу -Xms<min> и выше -Xmx<max>.

Значение параметра по умолчанию

MinHeapFreeRatio 40

MaxHeapFreeRatio 70

-Xms 3670 тыс.

-Xmx 64 м

Значения по умолчанию параметров размера кучи в 64-битных системах были увеличены примерно на 30%. Это увеличение предназначено для компенсации большего размера объектов в 64-битной системе.

С этими параметрами, если процент свободного пространства в поколении падает ниже 40%, поколение будет расширено, чтобы сохранить 40% свободного пространства, до максимально допустимого размера поколения. Точно так же, если свободное пространство превышает 70%, генерация будет сокращена, так что только 70% пространства будет свободным, при условии минимального размера генерации.

Большие серверные приложения часто испытывают две проблемы с этими значениями по умолчанию. Одним из них является медленный запуск, потому что начальная куча мала и должна быть изменена во многих основных коллекциях. Более насущная проблема заключается в том, что максимальный размер кучи по умолчанию неоправданно мал для большинства серверных приложений. Практические правила для серверных приложений:

  • Если у вас нет проблем с паузами, попробуйте выделить виртуальной машине как можно больше памяти. Размер по умолчанию (64 МБ) часто слишком мал.
  • Установка -Xms и -Xmx в одно и то же значение повышает предсказуемость, удаляя наиболее важное решение о размере из виртуальной машины. Однако виртуальная машина не сможет компенсировать это, если вы сделаете плохой выбор.
  • Как правило, увеличивайте объем памяти по мере увеличения числа процессоров, поскольку распределение может быть распараллелено.

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