Что произойдет, если вы укажете максимальный размер кучи, превышающий доступную оперативную память - PullRequest
19 голосов
/ 06 сентября 2010

Спросил в интервью. Что произойдет, если вы укажете максимальный размер кучи (Xmx), превышающий доступную оперативную память? Мне также интересно, что произойдет, если вы укажете минимальный размер кучи (Xms) больше доступной оперативной памяти?

Ответы [ 3 ]

12 голосов
/ 06 сентября 2010

Самый простой способ узнать это - попробовать и посмотреть.

Редактировать: На самом деле есть как минимум два ответа на вопрос.Вероятно, в 64-битной системе, как уже упоминалось, ваше приложение может расти и расти в использовании памяти и начать перебивать.В 32-битной системе история немного отличается, потому что ОС не может дать вам столько места в куче.Например, если я запускаю приложение в Windows XP с 32-битным Java с параметром командной строки -Xmx2000m, оно умрет с сообщением, подобным следующему:

Неверный максимальный размер кучи: -Xmx2000m

Указанный размер превышает максимально допустимый размер.

Не удалось создать виртуальную машину Java.

В Linux с 32-битным Java, я получаю следующее с -Xmx3000m:

Не удалось создатьвиртуальная машина Java.

Произошла ошибка во время инициализации ВМ

Не удалось зарезервировать достаточно места для кучи объектов

В Linux с 32-битной Java я получаюследующие с -Xmx6000m

Неверный максимальный размер кучи: -Xmx6000m

Указанный размер превышает максимальный представимый размер.

Не удалось создать виртуальную машину Java.

При использовании 64-битной Java Java JVM позволяет выделять больше памяти, чем физической памяти, хотя, если вы запросите слишком большой объем памяти, jvm снова завершится с ошибкой.

4 голосов
/ 06 сентября 2010

Ничего драматичного


Хотя это может случиться с некоторыми низкоуровневыми встроенными системами, в наши дни довольно редко можно увидеть не виртуальную среду Java, даже встроенную и невозможную на настольном компьютере илиserver.

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

Если серьезное, это состояние называется " thrashing " и ононе очень хорошая вещьМатериал будет работать медленно.

3 голосов
/ 26 февраля 2019

Только если -Xms (минимум) больше доступной памяти, вы получите немедленный сбой при инициализации JVM

$>java -Xms100g            #JVM fails to start
Error occurred during initialization of VM Could not
reserve enough space for object heap

Если ваш - Xmx (максимум) больше доступной памяти, которую JVM инициализирует, поскольку вы еще не используете память

$>java -Xmx100g            #JVM starts up fine
Usage: java [-options] class [args...]
...

Если ваш -Xmx (максимум) больше доступной памяти (общий объем памяти для включения любой виртуальной памяти)память) вы получите сбой во время выполнения тогда и только тогда, когда ваши процессы JVM на самом деле попытаются использовать больше памяти, чем имеет машина.

OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00007f5feb100000, 927465472, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 927465472 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /some/file/path/hs_err_pid25.log

Это не 'thrash' до тех пор, пока он не приблизится к вашему пределу -Xmx, но если этот предел превысит вашу доступную память, вы получите указанную выше ошибку выделения памяти, и ваша программа прекратит работу до того, как даже будет рассмотрена процедура переброса.(И это очень драматично!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...