Как создается адресное пространство процесса
Что проверяют
Понимаете ли вы, что адресное пространство создаёт операционная система, а не JVM, и что оно виртуальное: адреса есть, а физической памяти за ними может не быть. Следом обычно спрашивают, почему у Java-процесса VIRT в top намного больше -Xmx, а RSS меньше.
Как отвечать
Опишите путь на Linux: процесс появляется через fork(), который копирует таблицы страниц родителя с пометкой copy-on-write, затем execve() выбрасывает старое пространство и строит новое по ELF-файлу. Ядро создаёт области (VMA):
- код (text): отображается из файла только на чтение и исполнение, общий для всех процессов с тем же бинарником;
- data и bss: инициализированные и обнулённые глобальные данные;
- куча: растёт через
brkили выделяется черезmmap; - разделяемые библиотеки:
libc,libjvm.so, тоже черезmmap; - стек: у главного потока свой, у каждого следующего потока отдельный;
- ядро: верхняя часть адресов, из пользовательского режима недоступна.
Ключевое слово здесь «лениво». Ядро только резервирует диапазоны, а физическая страница выделяется при первом обращении через page fault. Трансляцию адресов делает MMU по таблицам страниц, кэш трансляций называется TLB. Раскладку при каждом запуске случайно сдвигает ASLR.
Потом переходите к JVM. Это обычный процесс, который внутри своего пространства резервирует через mmap диапазон под кучу размером -Xmx, а коммитит страницы по мере роста. Рядом лежат Metaspace, Code Cache, стеки потоков (-Xss), direct-буферы из ByteBuffer.allocateDirect. Поэтому память процесса больше размера кучи, и в контейнере это важно при выборе лимита.
Где спотыкаются
Говорят, что JVM создаёт адресное пространство для каждого Java-процесса. Его создаёт ядро при execve, JVM лишь раскладывает свои области внутри.
Путают виртуальную память с подкачкой. Своп лишь одно из применений, главное здесь изоляция процессов и ленивое выделение.
Называют эти области сегментацией. На x86-64 аппаратная сегментация фактически плоская, всё держится на страницах, а text, heap и stack это просто диапазоны адресов.