Размер Xmxsize по умолчанию в Java 8 (максимальный размер кучи)

В документации Oracle я нашел:

-Xmxsize Задает максимальный размер (в байтах) пула распределения памяти в байтах ... Значение по умолчанию выбирается во время выполнения на основе конфигурации системы.

Что означает конфигурация системы?


person Vitaly    schedule 02.02.2015    source источник
comment
Это означает, что если в вашей системе 16 ГБ ОЗУ, размер будет больше, чем при 512 МБ.   -  person JB Nizet    schedule 02.02.2015
comment
Спасибо, насколько больше?   -  person Vitaly    schedule 02.02.2015
comment
Максимальный размер кучи ищите здесь   -  person Nir Alfasi    schedule 02.02.2015
comment
›› Меньше 1/4 физической памяти или 1 ГБ. Спасибо, @alfasin.   -  person Vitaly    schedule 02.02.2015
comment
oracle.com/technetwork/java/ergo5-140223.html   -  person jmj    schedule 02.02.2015
comment
@Vitaly Предел в 1 ГБ, кажется, не подходит для -Xmx, по крайней мере, в Java 8, потому что в моей 64-битной системе linux с общим объемом памяти 6 ГБ у меня jvm по умолчанию имеет -Xmx = 1,5 ГБ.   -  person user218867    schedule 18.01.2017
comment
@Vitaly, пожалуйста, обратите внимание, что ваш ответ касается Java SE5. Начиная с SE8, максимальный размер кучи по умолчанию для клиентского jvm составляет 256 МБ.   -  person Vyshnav Ramesh Thrissur    schedule 08.05.2019
comment
@Eric Wang, возможно, вы использовали сервер jvm вместо клиентского jvm. Сервер jvm может иметь максимальный размер кучи 1 или 32 ГБ по умолчанию в зависимости от оперативной памяти.   -  person Vyshnav Ramesh Thrissur    schedule 08.05.2019
comment
Отвечает ли это на ваш вопрос? Как определяется максимальный размер кучи Java по умолчанию?   -  person rogerdpack    schedule 06.04.2020


Ответы (5)


Это зависит от реализации и версии, но обычно зависит от используемой виртуальной машины (например, клиента или сервера, см. Параметры -client и -server) и от вашей системной памяти.

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

Также параметры конфигурации Java (параметры командной строки) могут быть «переданы на аутсорсинг» переменным среды, включая -Xmx, который может изменить значение по умолчанию (то есть указать новое значение по умолчанию). В частности, переменная среды JAVA_TOOL_OPTIONS проверяется всеми инструментами Java и используется, если существует (подробнее здесь и здесь).

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

java -XX:+PrintFlagsFinal -version

Это дает вам длинный список, -Xmx находится в MaxHeapSize, -Xms находится в InitialHeapSize. Отфильтруйте свой вывод (например, |grep в Linux) или сохраните его в файле, чтобы вы могли искать в нем.

person icza    schedule 02.02.2015
comment
В качестве небольшого дополнения вы можете запустить java -XX:+PrintCommandLineFlags, чтобы распечатать размеры кучи (и другую информацию), выбранные JVM на основе текущей системной информации. - person Cristian Vat; 02.02.2015
comment
@CristianVat Да, но параметр -XX:+PrintFlagsFinal, тот, который вы предложили, мне не подходит. Добавляем к ответу. - person icza; 02.02.2015
comment
Правильно, извините -XX:+PrintFlagsFinal - лучший вариант, поскольку он должен отображать всю информацию после того, как все было учтено (включая ручные параметры и эргономику). Хотя -XX:+PrintCommandLineFlags, похоже, работает на моей JVM (может зависеть от точной версии) - person Cristian Vat; 02.02.2015
comment
Для больших ящиков это правило 1/4 RAM определенно не выполняется. На 4-сокетном сервере с 64 ГБ на сокет (т. Е. 256 ГБ ОЗУ) Xmx по умолчанию составляет ~ 32 ГБ. 32 ГБ может быть связано с ограничениями CompressedOops, которые находятся примерно на этом этапе. - person FauxFaux; 12.11.2015
comment
Это только строки, связанные с размером кучи: java -XX:+PrintFlagsFinal -version | grep HeapSize - person user218867; 18.01.2017
comment
Есть ли способ изменить само значение отношения 1/4 вместо значения Xmx? Это поможет в контейнерном сценарии с установленным флагом -XX:+UseCGroupMemoryLimitForHeap. - person xmar; 20.03.2019
comment
@icza Я считаю, что 1/4 соответствует клиентскому jvm, а 1 ГБ соответствует jvm сервера с 4 ГБ / больше физической памяти. И 32 ГБ для jvm сервера или 128 ГБ / больше физической памяти. Пожалуйста, поправьте меня, если я ошибаюсь - person Vyshnav Ramesh Thrissur; 08.05.2019
comment
@VyshnavRameshThrissur Может быть. У вас есть источники (ссылка) для подтверждения? - person icza; 09.05.2019
comment
@icza я опубликовал это как ответ ниже. Пожалуйста, взгляните на это. stackoverflow.com/a/56036202/5649620 - person Vyshnav Ramesh Thrissur; 09.05.2019

Как вы уже упоминали, значение по умолчанию -Xmxsize (Максимальный размер кучи) зависит от конфигурации вашей системы.

Java8 client занимает больше 1/64 вашей физической памяти для Xmssize (минимальный размер кучи) и меньше 1/4 вашей физической памяти для -Xmxsize (максимального размера кучи).

Это означает, что если у вас есть физическая память размером 8 ГБ ОЗУ, у вас будет Xmssize больше 8 * (1/64) и меньше -Xmxsizeas 8 * (1/4).

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

В Windows:

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

В Linux:

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

Эти значения по умолчанию также можно изменить на желаемую сумму.

person Sarat Chandra    schedule 12.04.2017
comment
comment
docs.oracle.com/javase/8/ docs / technotes / guides / vm / по этой ссылке, по умолчанию для минимального / начального значения 1/64, а не 1/6. Больше 1/64 физической памяти машины на машине или некоторый разумный минимум - person Vyshnav Ramesh Thrissur; 08.05.2019

Удивительно, но у этого вопроса нет окончательного задокументированного ответа. Возможно, другая точка данных будет полезна другим, ищущим ответ. В моих системах под управлением CentOS (6.8,7.3) и Java 8 (сборка 1.8.0_60-b27, 64-разрядный сервер):

память по умолчанию составляет 1/4 физической памяти, а не ограничивается 1 ГБ.

Кроме того, -XX:+PrintFlagsFinal выводится в STDERR, поэтому команда для определения текущей памяти по умолчанию, представленная другими выше, должна быть изменена на следующее:

java -XX:+PrintFlagsFinal 2>&1 | grep MaxHeapSize

В системе с 64 ГБ физической RAM возвращается следующее:

uintx MaxHeapSize                                  := 16873684992      {product}
person brianNotBob    schedule 27.01.2017
comment
В моей системе с 16 ГБ ОЗУ: 2069889024 = 2 ГБ. - person david.perez; 07.02.2017
comment
64-разрядная Windows 7 с 8 ГБ ОЗУ: 32-разрядные JVM: 256 МБ, 64-разрядные JVM: 2 ГБ - person golimar; 22.02.2017
comment
Наконец нашел для него документацию: stackoverflow.com/a/56036202/32453 - person rogerdpack; 06.04.2020

На моей виртуальной машине Ubuntu с общим объемом ОЗУ 1048 МБ java -XX:+PrintFlagsFinal -version | grep HeapSize напечатано: uintx MaxHeapSize := 266338304, что составляет примерно 266 МБ и составляет 1/4 от общего объема ОЗУ.

person Binita Bharati    schedule 27.04.2018
comment
Мне кажется, что OpenJDK и Oracle имеют разные характеристики - я вижу, что OpenJDK всегда использует 1/4 ОЗУ как -Xmx (никогда не меньше 1/4 и 1 ГБ) - person pogul; 20.08.2018

По состоянию на 8 мая 2019 г .:

Размер кучи JVM зависит от конфигурации системы, что означает:

а) клиентский jvm vs сервер jvm

б) 32-битная или 64-битная.

Ссылки:

1) обновление с J2SE5.0: https://docs.oracle.com/javase/6/docs/technotes/guides/vm/gc-ergonomics.html
2) краткий ответ: https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/ergonomics.html
3) подробный ответ: https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html#default_heap_size
4) клиент против сервера: https://www.javacodegeeks.com/2011/07/jvm-options-client-vs-server.html

Резюме: (его сложно понять из приведенных выше ссылок. Итак, резюмируя их здесь)

1) Максимальный размер кучи для клиента jvm по умолчанию составляет 256 МБ (есть исключение, см. Ссылки выше).

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

Таким образом, максимальный размер кучи jvm по умолчанию: 256 МБ или 1 ГБ или 32 ГБ в зависимости от виртуальной машины, как указано выше.

person Vyshnav Ramesh Thrissur    schedule 08.05.2019
comment
Наконец, ссылки на настоящий документ, объясняющий, что происходит. - person rogerdpack; 06.04.2020