Что такое виртуальная память?
Виртуальная память — это механизм управления памятью, при котором каждый процесс работает со своим собственным виртуальным адресным пространством, которое отображается на физическую оперативную память (и диск) средствами ОС и аппаратного обеспечения (MMU).
Аналогия: каждому жильцу многоквартирного дома кажется, что у него «квартира номер 1 на первом этаже». На самом деле управляющая компания (ОС) расселяет всех по разным физическим квартирам, а жильцы об этом не знают. Если физических квартир не хватает — часть вещей временно вывозят на склад (swap).
Зачем нужна виртуальная память
- Изоляция процессов — каждый процесс видит только свою память и не может повредить память другого процесса.
- Абстракция — процесс думает, что у него есть непрерывное адресное пространство, хотя в физической памяти данные могут быть разбросаны.
- Расширение памяти — суммарный объём виртуальной памяти всех процессов может превышать объём физической RAM за счёт использования диска (swap).
Страничная организация (Paging)
- Виртуальное адресное пространство разбивается на страницы (pages) фиксированного размера (обычно 4 КБ).
- Физическая память разбивается на фреймы (frames) того же размера.
- Таблица страниц (page table) — структура данных, поддерживаемая ОС, которая хранит соответствие: виртуальная страница -> физический фрейм.
- Каждый процесс имеет собственную таблицу страниц.
Трансляция адреса
- Процесс обращается к виртуальному адресу.
- MMU (Memory Management Unit) — аппаратный блок в процессоре — разделяет адрес на номер страницы и смещение внутри страницы.
- По номеру страницы ищется физический фрейм в таблице страниц.
- Физический адрес = адрес фрейма + смещение.
TLB (Translation Lookaside Buffer)
- Специальный кэш в процессоре для хранения недавних трансляций «виртуальная страница -> физический фрейм».
- Обращение к TLB — 1-2 такта. Промах по TLB (TLB miss) требует обхода таблицы страниц — десятки тактов.
- TLB обычно содержит 64-1024 записи.
- При переключении между процессами TLB сбрасывается, что делает переключение контекста между процессами дорогим.
Подкачка (Swap)
- Когда физической памяти не хватает, ОС выгружает редко используемые страницы на диск (в swap-файл или swap-раздел).
- Когда процесс обращается к выгруженной странице, возникает page fault (страничная ошибка): ОС приостанавливает процесс, загружает страницу с диска обратно в RAM, обновляет таблицу страниц и возобновляет процесс.
- Page fault — очень дорогая операция (миллисекунды), поэтому частое использование swap резко снижает производительность.
Значение для Java-разработчика
- JVM-процесс работает в виртуальном адресном пространстве. Heap, стеки потоков, metaspace — всё это виртуальные адреса.
- Если JVM выделяет больше памяти, чем есть физической RAM, ОС начнёт swap, и GC-паузы могут вырасти с миллисекунд до секунд.
- Рекомендация для production: суммарная память всех JVM-процессов + ОС не должна превышать физическую RAM. Многие команды явно отключают swap на серверах (
swapoff -a) или настраиваютvm.swappiness=0. - Huge Pages (2 МБ или 1 ГБ вместо 4 КБ) снижают нагрузку на TLB и могут улучшить производительность JVM с большим heap. Включаются через
-XX:+UseLargePages.
Вывод
Виртуальная память обеспечивает изоляцию процессов, абстракцию адресного пространства и возможность использовать больше памяти, чем есть физической RAM. Механизм основан на страничной организации и аппаратной трансляции адресов через MMU и TLB. Для Java-приложений критически важно не допускать ухода в swap.
На собеседовании: middle-вопрос. Ключевые моменты: что такое page table и TLB, почему переключение контекста между процессами дорого (сброс TLB), и почему swap — враг JVM-приложений в production. Если расскажете про Huge Pages — это бонус.