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

81

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

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

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

Виталий
источник
1
Это означает, что если в вашей системе 16 ГБ ОЗУ, размер будет больше, чем при 512 МБ.
JB Nizet
Спасибо, насколько больше?
Виталий
Посмотрите на «максимальный размер кучи» здесь
Нир Альфаси
3
>> Меньше 1/4 физической памяти или 1 ГБ. Спасибо, @alfasin.
Виталий
4
@Vitaly Кажется, что ограничение в 1 Гб не соблюдается -Xmx, по крайней мере, в Java 8, потому что в моей 64-битной системе Linux с общим объемом памяти 6 Гб у меня jvm по умолчанию имеет -Xmx = 1,5 Гб.
user218867

Ответы:

144

Это зависит от реализации и версии, но , как правило , это зависит от ВМ используется (например , клиент или сервер см -clientи -serverпараметры) и системная память.

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

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

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

java -XX:+PrintFlagsFinal -version

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

icza
источник
11
В качестве небольшого дополнения вы можете запустить java -XX:+PrintCommandLineFlagsраспечатку размеров кучи (и другой информации), выбранных JVM на основе текущей системной информации
Кристиан Ват
1
@CristianVat Да, но параметр -XX:+PrintFlagsFinal, который вы предложили, мне не подходит. Добавляем к ответу.
icza 02 фев.15,
Правильно, извините -XX:+PrintFlagsFinal- лучший вариант, поскольку он должен отображать всю информацию после того, как все было учтено (включая ручные настройки и эргономику). Хотя, -XX:+PrintCommandLineFlagsпохоже, работает на моей JVM (может зависеть от точной версии)
Кристиан Ват
2
Для больших ящиков это практическое правило "1/4 RAM" определенно не работает. На 4-сокетном сервере с 64 ГБ на сокет (т.е. 256 ГБ ОЗУ) Xmx по умолчанию составляет ~ 32 ГБ. 32 ГБ может быть связано с ограничениями CompressedOops, которые находятся примерно на этом этапе.
FauxFaux
2
Это только строки, связанные с размером кучи:java -XX:+PrintFlagsFinal -version | grep HeapSize
user218867
37

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

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

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

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

В Windows :

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

В Linux :

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

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

Сарат Чандра
источник
docs.oracle.com/javase/8/docs/technotes/guides/vm/… согласно этой ссылке, по умолчанию для минимума / начального значения 1/64, а не 1/6. «Больше 1/64 физической памяти на машине или некоторый разумный минимум»
1/64
15

Удивительно, но у этого вопроса нет окончательного задокументированного ответа. Возможно, другая точка данных будет полезна другим, ищущим ответ. В моих системах под управлением 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}
brianNotBob
источник
В моей системе с 16 ГБ ОЗУ: 2069889024 = 2 ГБ.
david.perez 07
Windows 7 64-битная с 8 ГБ ОЗУ: 32-битные JVM: 256 МБ, 64-
битные
Наконец нашел документацию для него: stackoverflow.com/a/56036202/32453
rogerdpack
2

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

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

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

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

а) клиент jvm против сервера 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) Максимальный размер кучи по умолчанию для Client jvm составляет 256 МБ (есть исключение, см. Ссылки выше).

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

Так по умолчанию размер максимальной JVM кучи: 256mb или 1gb или 32gb в зависимости от VM, выше.

Вишнав Рамеш Триссур
источник
1
Наконец, ссылки на настоящий документ, объясняющий, что происходит.
rogerdpack