В документации Oracle я нашел:
-Xmxsize Задает максимальный размер (в байтах) пула распределения памяти в байтах ... Значение по умолчанию выбирается во время выполнения на основе конфигурации системы.
Что означает конфигурация системы?
В документации Oracle я нашел:
-Xmxsize Задает максимальный размер (в байтах) пула распределения памяти в байтах ... Значение по умолчанию выбирается во время выполнения на основе конфигурации системы.
Что означает конфигурация системы?
Это зависит от реализации и версии, но обычно зависит от используемой виртуальной машины (например, клиента или сервера, см. Параметры -client
и -server
) и от вашей системной памяти.
Часто для client
значение по умолчанию составляет 1/4 вашей физической памяти или 1 ГБ (в зависимости от того, что меньше).
Также параметры конфигурации Java (параметры командной строки) могут быть «переданы на аутсорсинг» переменным среды, включая -Xmx
, который может изменить значение по умолчанию (то есть указать новое значение по умолчанию). В частности, переменная среды JAVA_TOOL_OPTIONS
проверяется всеми инструментами Java и используется, если существует (подробнее здесь и здесь).
Вы можете запустить следующую команду, чтобы увидеть значения по умолчанию:
java -XX:+PrintFlagsFinal -version
Это дает вам длинный список, -Xmx
находится в MaxHeapSize
, -Xms
находится в InitialHeapSize
. Отфильтруйте свой вывод (например, |grep
в Linux) или сохраните его в файле, чтобы вы могли искать в нем.
java -XX:+PrintCommandLineFlags
, чтобы распечатать размеры кучи (и другую информацию), выбранные JVM на основе текущей системной информации.
- person Cristian Vat; 02.02.2015
-XX:+PrintFlagsFinal
, тот, который вы предложили, мне не подходит. Добавляем к ответу.
- person icza; 02.02.2015
-XX:+PrintFlagsFinal
- лучший вариант, поскольку он должен отображать всю информацию после того, как все было учтено (включая ручные параметры и эргономику). Хотя -XX:+PrintCommandLineFlags
, похоже, работает на моей JVM (может зависеть от точной версии)
- person Cristian Vat; 02.02.2015
java -XX:+PrintFlagsFinal -version | grep HeapSize
- person user218867; 18.01.2017
-XX:+UseCGroupMemoryLimitForHeap
.
- person xmar; 20.03.2019
Как вы уже упоминали, значение по умолчанию -Xmxsize
(Максимальный размер кучи) зависит от конфигурации вашей системы.
Java8 client
занимает больше 1/64 вашей физической памяти для Xmssize
(минимальный размер кучи) и меньше 1/4 вашей физической памяти для -Xmxsize
(максимального размера кучи).
Это означает, что если у вас есть физическая память размером 8 ГБ ОЗУ, у вас будет Xmssize
больше 8 * (1/64) и меньше -Xmxsize
as 8 * (1/4).
Вы можете проверить размер кучи по умолчанию с помощью
В Windows:
java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
В Linux:
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
Эти значения по умолчанию также можно изменить на желаемую сумму.
Удивительно, но у этого вопроса нет окончательного задокументированного ответа. Возможно, другая точка данных будет полезна другим, ищущим ответ. В моих системах под управлением 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}
На моей виртуальной машине Ubuntu с общим объемом ОЗУ 1048 МБ java -XX:+PrintFlagsFinal -version | grep HeapSize
напечатано: uintx MaxHeapSize := 266338304
, что составляет примерно 266 МБ и составляет 1/4 от общего объема ОЗУ.
По состоянию на 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 ГБ в зависимости от виртуальной машины, как указано выше.
-Xmx
, по крайней мере, в Java 8, потому что в моей 64-битной системе linux с общим объемом памяти 6 ГБ у меня jvm по умолчанию имеет -Xmx = 1,5 ГБ. - person user218867   schedule 18.01.2017