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


421

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

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

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


1
Конфигурация системы означает: а) клиент jvm против сервера jvm b) 32 бита против 64 бита. Ссылки: 1) обновление с J2SE5.0 docs.oracle.com/javase/6/docs/technotes/guides/vm/… 2) краткий ответ: docs.oracle.com/javase/8/docs/technotes/guides/vm / gctuning /… 3) подробный ответ: docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/… 4) клиент против сервера: javacodegeeks.com/2011/07/jvm-options-client- vs-server.html
Вишнав Рамеш Триссур

2
это трудно понять из приведенных выше ссылок. Итак, суммируем их здесь: Максимальный размер кучи для клиента jvm составляет 256 Мб (есть исключение, читайте по ссылкам выше). Максимальный размер кучи для сервера jvm 32-битный составляет 1 ГБ, а 64-битный - 32 ГБ (опять же, здесь есть исключения. Пожалуйста, прочитайте это по ссылкам). Таким образом, его 256 МБ или 1 ГБ или 32 ГБ
Вишнав Рамеш Триссур

Ответы:


507

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

java -XX: + PrintFlagsFinal -version | findstr HeapSize

Ищите варианты MaxHeapSize(для -Xmx) и InitialHeapSizeдля -Xms.

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

java -XX: + PrintFlagsFinal -version | grep HeapSize

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


3
Я надеялся на хороший вариант, подобный этому, но у меня не получилось использовать Java 6 VM от IBM.
Мэтт Лавин

Большой! Могу ли я играть со всеми этими опциями по умолчанию? Какова соответствующая переменная ENV для каждого?
Elist

28
В моем случае на Linux, InitialHeapSize = 262803264а MaxHeapSize = 4206886912это около 256 МБ и 4 ГБ, если я не ошибаюсь. Означает ли это, что каждая JVM запускается так, как если бы она была запущена с -Xms256m -Xmx4gопциями?
Юрий Наконечный

9
В системе Windows:java -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
sp00m

1
@matanster В моем Linux -versionподавлен длинный текст «использования» stderr.
Франклин Ю

115

Для Java SE 5: в соответствии с эргономикой сборщика мусора [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 мегабайта

4
Предостережение: это для машин серверного класса, а не клиентского класса. Вам необходимо прочитать этот документ вместе с java.sun.com/docs/hotspot/gc5.0/ergo5.html, который определяет эти термины и то, что происходит с компьютерами клиентского класса. Dogbane, могу ли я смиренно предложить вам отредактировать свой ответ, чтобы процитировать соответствующие отрывки?
Том Андерсон

3
Это поразительно низкий показатель по умолчанию в 2012 году. Очень мало серьезных приложений поместятся в 64 мегабайта.
Марк Э. Хаас

1
См. Ответ Эрнесто от 30 октября 2012 г. для клиентских машин после обновления Java 6 18.
Энди Томас,

Также имейте в виду, что в нем говорится: «Границы и доли, указанные для размера кучи, верны для J2SE 5.0. Они могут отличаться в последующих выпусках, поскольку компьютеры становятся более мощными».
Lodovik

Кстати, этот алгоритм только для Parallel Garbage Collector.
Майк Аргириу,

45

Java 8 занимает больше , чем 1 / 64th вашей физической памяти для Xmssize (Минимальное 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.


5
не 1/64 вместо 1/6?
Вишнав Рамеш Триссур

1
Да, Xmssize (Minimum HeapSize / InitialHeapSize) занимает более 1/64 вашей физической памяти, а Xmxsize (Maximum HeapSize / MaxHeapSize) - менее 1/4 вашей физической памяти. (Например, для моего Mac, имеющего 16 ГБ ОЗУ, я получаю uintx InitialHeapSize: = 268435456 {product} uintx MaxHeapSize: = 4294967296 {product}, i, e Xms составляет 268 МБ и Xmx составляет 4,29 ГБ
sjethvani

1
Пожалуйста, отредактируйте ответ. Это 1/64, а не 1/6.
Изумрудный

35

Это изменено в Java 6 обновление 18 .

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


8
Неверно, на связанной странице написаноgreater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes
Паоло Фулгони

5
Я только что проверил на машине Linux с 5 ГБ физической памяти. Максимальная куча по умолчанию показывает 1,5 ГБ
Эрнесто

1
@PaoloFulgoni нет, еще один практический пример, который я наблюдаю сейчас: 129 Гбайт физической памяти приводит к 32 Гбайтам максимального размера кучи
Кирилл

См. Ответ apl, почему это правильно: stackoverflow.com/a/13310792/32453 См. Также stackoverflow.com/a/56036202/32453
rogerdpack

16

Эрнесто прав. По ссылке он разместил [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


9

Для 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. ? Ланг = еп


Ссылка кажется (эффективно) неработающей.
Питер Мортенсен

@PeterMortensen только что проверил - ссылка в порядке
n0mer

8

В заключение!

Начиная с Java 8u191 у вас теперь есть варианты:

-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage

это можно использовать для определения размера кучи в процентах от используемой физической памяти. (что совпадает с установленной оперативной памятью меньше, чем использует ядро).

См. Примечания к выпуску для Java8 u191 для получения дополнительной информации. Обратите внимание, что параметры упоминаются под заголовком Docker, но на самом деле они применяются независимо от того, находитесь ли вы в среде Docker или в традиционной среде.

Значение по умолчанию для MaxRAMPercentage25%. Это крайне консервативно.

Мое собственное правило: если ваш хост более или менее выделен для запуска данного Java-приложения, то вы можете без проблем значительно увеличить его. Если вы работаете в Linux, работаете только со стандартными демонами и устанавливаете оперативную память где-то около 1 Гб и более, тогда я без колебаний использую 75% для кучи JVM. Опять же, помните, что это 75% доступной оперативной памяти , а не установленной . Остаются другие процессы пользователя земли, которые могут выполняться на хосте, и другие типы памяти, которые нужны JVM (например, для стека). Все вместе, это обычно хорошо вписывается в оставшиеся 25%. Очевидно, что при еще большем объеме установленной оперативной памяти ставка 75% безопаснее и безопаснее. (Я бы хотел, чтобы ребята из JDK реализовали опцию, в которой вы могли бы указать лестницу)

Настройка MaxRAMPercentageопции выглядит следующим образом:

java -XX:MaxRAMPercentage=75.0  ....

Обратите внимание, что эти процентные значения имеют тип 'double', и поэтому вы должны указывать их с десятичной точкой. Вы получите несколько странную ошибку, если вы используете «75» вместо «75.0».


7

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

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

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

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

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

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

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

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

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

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


5

XmsИ Xmxявляются флаг виртуальной машины Java (JVM):

  • Xms: initial and minimumJVMheap 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: maximumJVMheap 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 Опции командной строки


Разве это не для JRockit JVM? (в отличие от JVM Hotspot от Oracle)
Петр

4

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.