По умолчанию Xmxsize в Java 8

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

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

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

Ответ 1

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

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

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

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

java -XX:+PrintFlagsFinal -version

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

Ответ 2

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

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

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

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

В Windows:

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

В Linux:

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

Эти значения по умолчанию также могут быть переопределены до требуемой суммы.

Ответ 3

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

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

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

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

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

uintx MaxHeapSize                                  := 16873684992      {product}

Ответ 4

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

Ответ 5

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

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

Так Максимальный размер кучи JVM: 256mb или 1gb или 32gb