Может ли JVM автоматически использовать больше пространства подкачки для предотвращения ошибок нехватки памяти

Как указано в разделе Общие сведения о распределении памяти JVM и нехватке памяти Java: пространство кучи, при выделении пространства кучи JVM не различает физическую и виртуальную память. Когда начинает выделяться память для Java-объектов и вычислений, JVM начинает различать виртуальную и физическую память. При наличии достаточного пространства подкачки (на компьютере с Linux), почему возникает ошибка нехватки памяти? Разве JVM не должна просто использовать пространство подкачки для завершения вычислений, хотя и очень медленно.

Например: RAM: 14 ГБ, пространство подкачки: 10 ГБ

Если java-приложению требуется 20 ГБ пространства, не может ли оно использовать пространство подкачки (виртуальную память) и завершить работу приложения?

Каково взаимодействие между пространством кучи и виртуальной памятью по отношению к Java-приложению?

2 ответа

Вы не понимаете, как это работает.

Процессы никогда не знают, какие части памяти они используют в виртуальной памяти, а какие - в физической памяти.

Это управляется ОС прозрачным способом. Обычно наиболее используемые или недавно использованные "блоки" (правильный термин "страницы") памяти хранятся в физической памяти. Программа просто требует памяти, ОС - это та, которая выделяет ее и решает, где находится каждая страница (виртуальная или физическая).

Чтобы использовать какой-то фрагмент памяти, у вас должна быть страница, где этот фрагмент находится в физической памяти. Перемещение страницы памяти с виртуальной на физическую довольно дорого, поэтому вы должны попытаться избежать этого. Таким образом, вы обычно указываете, что ваша куча меньше, чем ваша физическая память, чтобы позволить ОС пытаться сохранить все это в физической памяти (обратите внимание, что вы должны оставить дополнительную физическую память свободной для ОС и других приложений).

И на вопрос:

не может использовать дополнительные 8 ГБ из пространства подкачки (виртуальной памяти) и завершить работу приложения

Вы сказали JVM использовать не более 12 ГБ памяти, а теперь вы хотите, чтобы JVM игнорировала ваш заказ и выходила за пределы этих 12 ГБ? JVM - хороший парень и подчиняется вам, именно вы должны решить, предпочитаете ли вы ограничение памяти для обеспечения хорошей производительности или без ограничения кучи и разбиения на страницы риска (конечно, даже без явного ограничения, существуют ограничения, связанные с хостом машина ОС и ресурсы).

Эта ссылка предоставляет больше информации

Разве JVM не должна просто использовать пространство подкачки для завершения вычислений, хотя и очень медленно.

Это не просто медленно, если у вас есть вращающийся диск, он может быть более чем в 50000 раз медленнее. Когда выполняется ГХ, он может сканировать ГБ / с объектов, но представьте, что вместо этого он может сканировать только 100 с объектов в секунду. Это означает, что вместо нескольких секунд это займет около дня. Примечание: пока это происходит, машина становится непригодной для использования. В Windows вы даже не можете убить процесс и вынуждены выключить его, чтобы остановить.

Смогу ли я проверить это, если я не предоставлю никаких аргументов -Xmx и позволю Java-приложению работать столько, сколько потребуется

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

Это может быть интересным тестом, чтобы увидеть, успешно ли завершился ваш процесс, если бы он занимал какое-то время, но я бы ожидал, что он займет много заказов maginutde дольше.

Другие вопросы по тегам