Что это значит, что «память, запрашиваемая JVM у ОС, должна быть смежной»? - PullRequest
2 голосов
/ 12 апреля 2020

Я видел много людей в сети, которые утверждали, что «JVM запрашивает непрерывный нефрагментированный блок памяти у ОС при запуске». Я не могу понять, как это соотносится с понятием виртуальной памяти.

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

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

Итак, что я хотел бы понять:

  • Является ли утверждение о том, что память, выделенная ОС для JVM, должна быть
    смежной, действительно верной?
  • Если это так, то как ОС гарантирует, что память остается непрерывной, учитывая, что она может быть выгружена на диск и обратно в ОЗУ?
  • Если утверждение неверно, каковы могут быть причины, по которым ОС
    будет ли отрицать процесс виртуальной памяти, которую он запрашивает? Память
    превышение настроек?

1 Ответ

4 голосов
/ 12 апреля 2020
  1. JVM выделяет память для различных целей . Конечно, это не просто кусок памяти. Некоторые структуры JVM должны занимать непрерывный кусок, другие - нет.

  2. Если мы говорим о Java Кучи в HotSpot JVM - да, это непрерывный диапазон виртуальных адресное пространство.

  3. Непрерывная виртуальная память не должна поддерживаться непрерывной физической памятью. Таблица страниц отвечает за преобразование виртуальных адресов в физические и позволяет сопоставить непрерывный диапазон виртуальных адресов с фрагментированными физическими страницами даже после замены et c.

  4. Хотя обычно найти проблему непрерывного диапазона виртуальных адресов для кучи Java или другой структуры JVM в 64-битной системе обычно не проблема, в 32-битной системе это может быть реальной проблемой.

  5. Вы правы, настройки превышения памяти ОС могут вызвать сбой вызова mmap или mprotect, если общий размер виртуальной памяти процесса превышает пороговое значение.

...